查看有关关键状态的Java example,Oracle表示:


就绪表示密钥已准备好接受事件。第一次的时候
创建后,密钥处于就绪状态。

发出信号表示一个或多个事件已排队。一旦钥匙
已发出信号,直到复位之前它不再处于就绪状态
方法被调用。


WatchKey javadoc中:


按键处于发信号状态时检测到的事件已排队,但
请勿使钥匙重新排队以便从手表中取出
服务


该文档没有说明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();
}


...在sleep()允许的20秒内,我做了:


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


输出:

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.




Tks。

最佳答案

看起来,其他事件已被缓冲并且将被处理,或者当缓冲区已满时将给定事件类型为OVERFLOW。

从watchservice的文档中:

“文件系统报告事件的速度可能比其检索或处理事件的速度快,并且实现可能会对它可能累积的事件数量施加未指定的限制。在实现故意丢弃事件的情况下,它会安排键的pollEvents方法返回元素事件类型为OVERFLOW的事件。使用者可以将该事件用作重新检查对象状态的触发器。”

10-06 14:44