看看这个Java示例,关于密钥状态,Oracle说:
Ready表示密钥已准备好接受事件。第一次创建时,密钥处于就绪状态。
有信号表示一个或多个事件已排队。一旦钥匙已发出信号,在重置之前,它不再处于就绪状态方法。
在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 [testfile1.txt]
resetting.
polling.
Event ENTRY_MODIFY in [test] for entry [testfile1.txt]
Event ENTRY_DELETE in [test] for entry [testfile1.txt]
Event ENTRY_CREATE in [test] for entry [testfile2.txt]
Event ENTRY_MODIFY in [test] for entry [testfile2.txt]
Event ENTRY_DELETE in [test] for entry [testfile2.txt]
resetting.
Tks。
看起来像是缓冲了其他事件,当缓冲区填满时,这些事件将被处理或被赋予OVERFLOW的事件类型。
来自watchservice的文档:
"文件系统报告事件的速度可能快于检索或处理事件的速度,并且实现可能对其累积的事件数量施加未指定的限制。如果实现故意丢弃事件,则它会安排键的pollEvents方法返回事件类型为OVERFLOW的元素。消费者可以将此事件用作重新检查的触发器对象的状态。">