看一下这个Java示例,关于键状态,Oracle表示:
Ready 表示该键准备好接受事件。创建时,键处于就绪状态。
Signaled 表示有一个或多个事件已排队。一旦键被信号标记,直到调用重置方法之前,它将不再处于就绪状态。
在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.
谢谢。