3

看看这个Java 示例,关于关键状态,Oracle 说:

Ready表示密钥已准备好接受事件。首次创建时,密钥处于就绪状态。

Signaled表示一个或多个事件已排队。一旦密钥发出信号,它就不再处于就绪状态,直到调用重置方法。

WatchKeyjavadoc 中:

在密钥处于信号状态时检测到的事件会排队,但不会导致密钥重新排队以从监视服务中检索

文档没有说明key.pollEvents()和之间生成的事件会发生什么key.reset()假设事件将被缓冲直到键被重置,并且键将在重置后立即发出信号。下面的测试似乎支持这一点。

你能指点我一些官方文件吗?或讨论缺乏文件?


Path dir = Paths.get("test");
WatchService watcher = dir.getFileSystem().newWatchService();
dir.register(watcher, CREATE, DELETE, MODIFY);
while (true) {
    WatchKey key = watcher.take();
    System.out.println("polling.");
    for (WatchEvent<?> event : key.pollEvents()) {
        ... (details removed) ...
        System.out.format("  Event %s in [%s] for entry [%s]%n",
                          event.kind().name(), registeredDir, childPath);
        try { Thread.sleep(20000); } catch (InterruptedException e) { ; }
    }
    System.out.println("resetting.");
    key.reset();
}

...在 20 年代允许的范围内sleep(),我做了:

  • 创建一个文件,
  • 编辑它,保存它,
  • 重命名,
  • 编辑它,保存它,
  • 删除它

输出:

polling.
  Event ENTRY_CREATE in [test] for entry [test\file1.txt]
resetting.
polling.
  Event ENTRY_MODIFY in [test] for entry [test\file1.txt]
  Event ENTRY_DELETE in [test] for entry [test\file1.txt]
  Event ENTRY_CREATE in [test] for entry [test\file2.txt]
  Event ENTRY_MODIFY in [test] for entry [test\file2.txt]
  Event ENTRY_DELETE in [test] for entry [test\file2.txt]
resetting.

谢了。

4

1 回答 1

0

看起来额外的事件被缓冲并且当缓冲区填满时将被处理或给定事件类型 OVERFLOW。

来自 watchservice 的文档:

“文件系统报告事件的速度可能比它们被检索或处理的速度更快,并且实现可能会对它可能累积的事件数量施加未指定的限制。如果实现故意丢弃事件,那么它会安排键的 pollEvents 方法返回一个元素事件类型为 OVERFLOW。消费者可以使用此事件作为触发器来重新检查对象的状态。

于 2014-06-21T13:59:22.037 回答