В javadoc для StandardWatchEventKinds.ENTRY_MODIFY
говорится:
Запись каталога изменена. Когда каталог регистрируется для этого события, WatchKey ставится в очередь, когда обнаруживается, что запись в каталоге была изменена. Количество событий для этого события равно 1 или больше.
Когда вы редактируете содержимое файла с помощью редактора, он изменит как дату (или другие метаданные), так и содержимое. Таким образом, вы получаете два события ENTRY_MODIFY
, но каждое из них будет иметь count
из 1 (по крайней мере, это то, что я вижу).
Я пытаюсь отслеживать файл конфигурации (servers.cfg
, ранее зарегистрированный в WatchService
), который обновляется вручную (т. е. через командную строку vi
) с помощью следующего кода:
while(true) {
watchKey = watchService.take(); // blocks
for (WatchEvent<?> event : watchKey.pollEvents()) {
WatchEvent<Path> watchEvent = (WatchEvent<Path>) event;
WatchEvent.Kind<Path> kind = watchEvent.kind();
System.out.println(watchEvent.context() + ", count: "+ watchEvent.count() + ", event: "+ watchEvent.kind());
// prints (loop on the while twice)
// servers.cfg, count: 1, event: ENTRY_MODIFY
// servers.cfg, count: 1, event: ENTRY_MODIFY
switch(kind.name()) {
case "ENTRY_MODIFY":
handleModify(watchEvent.context()); // reload configuration class
break;
case "ENTRY_DELETE":
handleDelete(watchEvent.context()); // do something else
break;
}
}
watchKey.reset();
}
Поскольку вы получаете два события ENTRY_MODIFY
, описанное выше будет перезагружать конфигурацию дважды, когда требуется только один раз. Есть ли способ игнорировать все, кроме одного, если предположить, что таких событий может быть более одного?
Если в WatchService
API есть такая утилита, тем лучше. (Я как бы не хочу проверять время между каждым событием. Все методы обработчика в моем коде синхронны.
То же самое происходит, если вы создаете (копируете/вставляете) файл из одного каталога в отслеживаемый каталог. Как вы можете объединить их в одно событие?