关于关键状态,请看这个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.
韩国社交协会
答案 0 :(得分:0)
当缓冲区填满时,看起来缓冲了额外的事件并将被处理或给出事件类型OVERFLOW。
来自watchservice的文档:
“文件系统可以比检索或处理事件更快地报告事件,并且实现可能会对可能累积的事件数量施加未指定的限制。如果实现有意丢弃事件,则它会安排密钥的pollEvents方法返回事件类型为OVERFLOW的元素。消费者可以使用此事件作为重新检查对象状态的触发器。“