Java 监听指定目录的文件的增删改
使用 NIO 包中的 WatchService 实现监听文件增删改
WatchService 的 简单介绍
Java 提供了WatchService 接口,这个接口是利用操作系统本身的文件监听器对目录和文件进行监控,当被监控对象发生变化时,会又信号通知,从而可以高效的发生变化。
Java代码实现
- 定义一个监听线程 Listener
public class Listener implements Runnable{
private WatchService service; //定义WatchService
private String rootPath; //定义监听的路径
public Listener(WatchService service, String rootPath) {
this.service = service;
this.rootPath = rootPath;
}
@Override
public void run() {
try {
//无限轮询
while(true){
//service.take() 如果没有事件通知,则阻塞
WatchKey watchKey = service.take();
//获取事件集合
List<WatchEvent<?>> watchEvents = watchKey.pollEvents();
//对事件集合进行遍历,并打印。
//【event.contxt() : 触发事件的文件路径】
//【event.kind():事件类型】
// 【event.count(): 打印事件count】(如果count 大于1)则表示它是一个重复的事件
for(WatchEvent<?> event : watchEvents){
System.out.println("[" + rootPath + event.context() + "]文件发生了[" + event.kind()+"]事件" +
event.count());
}
watchKey.reset();
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println("sfdsf");
try{
service.close();
} catch (Exception e){
e.printStackTrace();
}
}
}
}
- 监听工具类
public class ResourceListener {
//新建一个线程池
private static ExecutorService fixedThreadPool = Executors.newCachedThreadPool();
//定义一个私有变量 ws
private WatchService ws;
//要监听的路径
private String listenerPath;
//在构造方法中进行初始化,并开启一个监听线程
private ResourceListener(String path) {
try {
ws = FileSystems.getDefault().newWatchService();
this.listenerPath = path;
start();
} catch (IOException e) {
e.printStackTrace();
}
}
private void start() {
//开启一个监听线程
fixedThreadPool.execute(new Listener(ws,this.listenerPath));
}
/**
* 对外提供的静态方法,只需要传入要监听的目录
* @param path
* @throws IOException
*/
public static void addListener(String path) throws IOException {
ResourceListener resourceListener = new ResourceListener(path);
Path p = Paths.get(path);
/**
* 1. WatchService 对象
* 2.监听创建事件
* 3.监听删除事件
* 4.监听修改事件
*/
p.register(resourceListener.ws,
StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_DELETE,
StandardWatchEventKinds.ENTRY_MODIFY);
}
public static void main(String[] args) throws IOException {
//使用工具类
ResourceListener.addListener("F:\\");
ResourceListener.addListener("d:\\");
}
}