JDK7引入WatchService监听文件系统,采用类似观察者的模式,注册相关的文件更改事件(新建,删除,修改,重命名等),当事件发生的,通知相关的监听者。
java.nio.file.*包提供了一个文件更改通知API,叫做Watch Service API.
实现流程如下
(1)为文件系统创建一个WatchService 实例 watcher
watcher = FileSystems.getDefault().newWatchService();
(2)为你想监听的目录注册 watcher。注册时,要注明监听的事件。
path.register(watcher, ENTRY_CREATE,ENTRY_DELETE,ENTRY_MODIFY);
(3)在无限循环里面等待事件的触发。当一个事件发生时,key发出信号,并且加入到watcher的queue
(4)从watcher的queue查找到key,你可以从中获取到文件名、发生的事件等相关信息
(5)遍历key的各种事件
(6)重置 key,重新等待事件
(7)关闭服务
具体代码:
import java.io.IOException; 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 static java.nio.file.StandardWatchEventKinds.*; /** * WatchService API使用实例 * @author xHong */ public class watchserviceTest { private WatchService watcher; public watchserviceTest(Path path)throws IOException{ watcher = FileSystems.getDefault().newWatchService(); path.register(watcher, ENTRY_CREATE,ENTRY_DELETE,ENTRY_MODIFY); } public void handleEvents() throws InterruptedException{ while(true){ WatchKey key = watcher.take(); for(WatchEvent event : key.pollEvents()){ WatchEvent.Kind kind = event.kind(); //事件可能lost or discarded if(kind == OVERFLOW){ continue; } WatchEvent e = (WatchEvent)event; Path fileName = (Path)e.context(); //System.out.printf("Event %s has happened,which fileName is %s%n" // ,kind.name(),fileName); if(kind.name() == "ENTRY_CREATE") { System.out.println(fileName + "-----> 创建!" ); }else if(kind.name() == "ENTRY_DELETE" ){ System.out.println(fileName + "-----> 删除!"); }else if(kind.name() == "ENTRY_MODIFY"){ System.out.println(fileName + "-----> 修改!"); } //System.out.printf("%s -----> %s%n",fileName,kind.name()); } if(!key.reset()){ break; } } } public static void main(String args[]) throws IOException, InterruptedException{ /* if(args.length!=1){ System.out.println("请设置要监听的文件目录作为参数"); System.exit(-1); } */ String watchDir = "f:/test"; new watchserviceTest(Paths.get(watchDir)).handleEvents(); } }