В 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
, приведенное выше будет перезагружать конфигурацию дважды, когда требуется только один раз. Есть ли способ игнорировать все, кроме одного, если предположить, что может быть более одного такого события?
Если API WatchService
имеет такую утилиту, тем лучше. (Я вроде бы не хочу проверять время между каждым событием. Все методы обработчика в моем коде синхронны.
То же самое происходит, если вы создаете (копируете/вставляете) файл из одного каталога в наблюдаемый каталог. Как вы можете объединить оба из них в одно событие?