查看有关关键状态的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的事件。使用者可以将该事件用作重新检查对象状态的触发器。”