Watching Service api (https://docs.oracle.com/javase/tutorial/essential/io/notification.html)看起来有点复杂和反直觉。所以我不知道如何正确使用它。让我们按照上面的url指南来做。
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;
}
}
您是对的,键只有在具有事件时才有用,这通常通过轮询监视程序来完成。但我想也可以直接定期轮询键,而不需要通过监视程序。javadoc在这方面不是很清楚。
这个API确实有点难用。我创建了一个实用程序类_FileMonitor,如果您阅读了源代码,就会发现正确使用监视程序API一点也不简单。您可以考虑使用我的实用程序类。