Глядя на этот пример Java о состоянии ключа, Oracle говорит :
Готово указывает, что ключ готов принимать события. При первом создании ключ находится в состоянии готовности.
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.
спасибо