2014-01-28 3 views
0

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

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 получает событие и останавливается. Есть ли какой-то параметр, который необходимо установить, и мне не хватает?

ответ

1

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

+0

Я бегу свою программу на UNIX. Я открываю файл в vi и закрываю его без сохранения. Как только я выхожу из файла, я вижу выход watcher.poll из режима ожидания. То, что я опубликовал выше, является фрагментом фактического кода, инструкция watcher.poll работает в цикле и корректно обрабатывает все реальные изменения. Только проблема заключается в том, что он получает событие, даже если файл открыто открыт в vi и закрыт без изменений. – user2881767

1

Я попытался код ниже в java7 и она отлично работает для меня в windows.Also пожалуйста, попробуйте watchkey сброс option.Below код, который используется для 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(); 
          } 

         } 

        }