观看服务 api ( https://docs.oracle.com/javase/tutorial/essential/io/notification.html ) 看起来有点复杂且违反直觉。所以我很困惑如何正确使用它。让我们按照上面网址中的指南进行操作。
WatchService watcher = FileSystems.getDefault().newWatchService();
Paths.get("C:/Path").register(watcher,
ENTRY_CREATE,
ENTRY_DELETE,
ENTRY_MODIFY) //return WatchKey object
register方法返回WatchKey对象。在指南中,它通常被省略。这很奇怪。可以怎样使用呢?从寄存器返回的结果是什么?因为获取 WatchKey 的正常方式如下所示:
for (;;) {
// wait for key to be signaled
WatchKey key;
try {
key = watcher.take();
} catch (InterruptedException x) {
return;
}
for (WatchEvent<?> event: key.pollEvents()) {
WatchEvent.Kind<?> kind = event.kind();
//procees all kinds of events there
if (kind == OVERFLOW) {
continue;
}
}
boolean valid = key.reset();
if (!valid) {
break;
}
}
最佳答案
你是对的,键只有在有事件时才有用,这通常是通过轮询观察者来完成的。但我想也可以直接定期轮询 key ,而不通过观察者。 javadoc对此不是很清楚。
这个API确实有点难用。我做了一个实用程序类_FileMonitor ,如果您阅读了源代码,正确使用 watcher API 一点也不简单。您可以考虑使用我的实用程序类。
关于java - 为什么Path类中的register方法返回WatchKey? (观看服务 Api,Java SE 7),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30742336/