2012-07-20 72 views
0

如何将下面的观察者转换为不断运行?即使在检测到更改后,我也希望它继续监听文件。一个线程也许?观察者在变更后停止

import java.io.IOException; 
import java.nio.file.*; 
import java.util.List; 

public class Listener { 

    public static void main(String[] args) { 

     Path myDir = Paths.get("C:/file_dir/listen_to_this"); 

     try { 
      WatchService watcher = myDir.getFileSystem().newWatchService(); 
      myDir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY); 
      WatchKey watckKey = watcher.take(); 
      List<WatchEvent<?>> events = watckKey.pollEvents(); 
      for (WatchEvent event : events) { 
       if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) { 
        System.out.println("Created: " + event.context().toString()); 
       } 
       if (event.kind() == StandardWatchEventKinds.ENTRY_DELETE) { 
        System.out.println("Delete: " + event.context().toString()); 
       } 
       if (event.kind() == StandardWatchEventKinds.ENTRY_MODIFY) { 
        System.out.println("Modify: " + event.context().toString()); 
       } 
      } 
     } catch (IOException | InterruptedException e) { 
      System.out.println("Error: " + e.toString()); 
     } 
    } 
} 

回答

2

不需要任何更多的线程。你可以简单地把它放在while循环内:

public static void main(String[] args) throws Exception { 
    Path myDir = Paths.get("C:/file_dir/listen_to_this"); 

    WatchService watcher = myDir.getFileSystem().newWatchService(); 
    myDir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY); 

    while (true) { 
     WatchKey watckKey = watcher.take(); 
     List<WatchEvent<?>> events = watckKey.pollEvents(); 
     for (WatchEvent event : events) { 
      if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) { 
       System.out.println("Created: " + event.context().toString()); 
      } 
      if (event.kind() == StandardWatchEventKinds.ENTRY_DELETE) { 
       System.out.println("Delete: " + event.context().toString()); 
      } 
      if (event.kind() == StandardWatchEventKinds.ENTRY_MODIFY) { 
       System.out.println("Modify: " + event.context().toString()); 
      } 
     } 
     watchKey.reset(); 
    } 
}