我正在使用以下方式观看目录Java 7 nio WatchService
通过使用以下方法。
Path myDir = Paths.get("/rootDir");
try {
WatchService watcher = myDir.getFileSystem().newWatchService();
myDir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);
WatchKey watckKey = watcher.take();
List<WatchEvent<?>> events = watckKey.pollEvents();
for (WatchEvent event : events) {
if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) {
System.out.println("Created: " + event.context().toString());
JOptionPane.showMessageDialog(null,"Created: " + event.context().toString());
}
if (event.kind() == StandardWatchEventKinds.ENTRY_DELETE) {
System.out.println("Delete: " + event.context().toString());
JOptionPane.showMessageDialog(null,"Delete: " + event.context().toString());
}
if (event.kind() == StandardWatchEventKinds.ENTRY_MODIFY) {
System.out.println("Modify: " + event.context().toString());
JOptionPane.showMessageDialog(null,"Modify: " + event.context().toString());
}
}
} catch (Exception e) {
System.out.println("Error: " + e.toString());
}
但上述方法仅响应该目录中发生的一个事件,之后该观察者不会响应该文件夹中发生的事件。有没有办法可以修改它以捕获文件夹内发生的所有事件。我还想修改它以捕获子文件夹中发生的事件。有人可以帮我吗?
谢谢。
From JavaDoc 的WatchService http://docs.oracle.com/javase/7/docs/api/java/nio/file/WatchService.html:
Watchable 对象通过调用其 register 方法向监视服务注册,并返回一个 WatchKey 来表示注册。当检测到对象的事件时,会向键发出信号,如果当前未发出信号,则会将其排队到监视服务,以便调用 poll 或 take 方法来检索键和处理事件的消费者可以检索它。一旦事件被处理,消费者调用密钥的重置方法来重置密钥,这允许密钥被发信号并与进一步的事件重新排队。
你只是打电话watcher.take() http://docs.oracle.com/javase/7/docs/api/java/nio/file/WatchService.html#take%28%29 once.
要关注进一步的事件,您必须致电watchKey.reset() http://docs.oracle.com/javase/7/docs/api/java/nio/file/WatchKey.html#reset%28%29食用后WatchEvent
s。将所有这些放在一个循环中。
while (true) {
WatchKey watckKey = watcher.take();
List<WatchEvent<?>> events = watckKey.pollEvents();
for (WatchEvent event : events) {
// process event
}
watchKey.reset();
}
还看一下Java 教程的相关部分 http://docs.oracle.com/javase/tutorial/essential/io/notification.html.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)