看看这个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();
}
...在 20 年代允许的范围内sleep()
,我做了:
- 创建一个文件,
- 编辑它,保存它,
- 重命名,
- 编辑它,保存它,
- 删除它
输出:
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.
谢了。