2

观看服务 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;
    }
}
4

1 回答 1

2

你是对的,一个键只有在它有事件时才有用,这通常是通过轮询观察者来完成的。但我想也可以定期直接轮询密钥,而无需通过观察者。javadoc对此不是很清楚。

API 确实有点难用。我创建了一个实用程序类_FileMonitor,如果您阅读了源代码,那么正确使用 watcher API 一点也不简单。您可以考虑改用我的实用程序类。

于 2015-06-09T22:29:50.453 回答