Java 7 WatchService ENTRY_MODIFY срабатывает при открытии файла

У меня есть программа, которая отслеживает каталог для обновления файлов, используя WatchService. Я получаю события, когда изменяю файл. Однако я заметил, что даже если я открываю файл в vi и не изменяю его содержимое, вызывается метод службы наблюдения poll. Мой код выглядит следующим образом:

watcher = FileSystems.getDefault().newWatchService();
Path path = Paths.get("conf");
path.register(watcher, ENTRY_MODIFY);
WatchKey key = null;

key = watcher.poll(MAX_WAIT_TIME, TimeUnit.SECONDS);
if (key != null) {
for (WatchEvent<?> events : key.pollEvents()) {
        WatchEvent<Path> ev = cast(events);
        Path fileName = ev.context();
    }

В приведенном выше коде watcher.poll ожидает MAX_WAIT_TIME для события ENTRY_MODIFY. Однако, когда я открываю файл в просматриваемом каталоге и закрываю без изменения его содержимого... watcher.poll получает событие и перестает ждать. Есть ли какой-то параметр, который нужно установить, а я отсутствует?


person user2881767    schedule 28.01.2014    source источник


Ответы (2)


Если вы сохраните файл перед закрытием, ОС увидит файл как измененный, даже если в нем нет изменений, и это вызовет событие ENTRY_MODIFY. Также ваш код принимает только один ключ часов. Если вы хотите продолжить просмотр каталога, вам нужно поместить инструкцию watcher.poll в цикл.

person BBogdan    schedule 28.01.2014
comment
Я запускаю свою программу в Unix. Я открываю файл в vi и закрываю его без сохранения. Как только я выхожу из файла, я вижу выход watcher.poll из режима ожидания. То, что я разместил выше, является фрагментом фактического кода, инструкция watcher.poll работает в цикле и правильно обрабатывает все подлинные события изменения. Единственная проблема заключается в том, что он получает событие, даже если файл просто открывается в vi и закрывается без изменений. - person user2881767; 28.01.2014

Я попробовал приведенный ниже код в java7, и он отлично работает для меня в Windows. Также попробуйте вариант сброса ключа наблюдения. Ниже приведен код, используемый для WatchService:

                    import java.nio.file.FileSystems;
                    import java.nio.file.Path;
                    import java.nio.file.Paths;
                    import java.nio.file.WatchEvent;
                    import java.nio.file.WatchKey;
                    import java.nio.file.WatchService;
                    import java.nio.file.StandardWatchEventKinds;

                    public class WatchServiceJava7Feature {


                        public static void main(String[] args) throws Exception {
                            System.out.println("here ");
                            WatchService  watchService = FileSystems.getDefault().newWatchService();
                            Path path= Paths.get("C:\\User\\code\\watchservice\\");
                            System.out.println("here 1");
                            path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE,StandardWatchEventKinds.ENTRY_DELETE,StandardWatchEventKinds.ENTRY_MODIFY);
                            while(true)
                            {
                            WatchKey key = watchService.take(); // this will return the keys
                            for(WatchEvent<?> event : key.pollEvents()) 
                             {
                                 WatchEvent<Path> watchEvent = (WatchEvent<Path>) event;
                                 WatchEvent.Kind<Path> kind = watchEvent.kind();
                                 switch(kind.name()) {
                                    case "ENTRY_MODIFY":
                                        System.out.println("Case Modify :Event on "+ event.context().toString() + " is "+ kind);
                                        break;
                                    case "ENTRY_DELETE":
                                        System.out.println("Case Delete :Event on "+ event.context().toString() + " is "+ kind);
                                        break; 
                                    case "ENTRY_CREATE":
                                        System.out.println("Case Create :Event on "+ event.context().toString() + " is "+ kind);
                                        break; 
                                }         

                             }
                             key.reset();  
                           }

                        }

                    }
person Subhasish Sahu    schedule 23.12.2016