Java 监听指定目录的文件的增删改


Java 监听指定目录的文件的增删改

  • 使用 NIO 包中的 WatchService 实现监听文件增删改
    • WatchService 的 简单介绍
    • Java代码实现

使用 NIO 包中的 WatchService 实现监听文件增删改 WatchService 的 简单介绍 【Java 监听指定目录的文件的增删改】Java 提供了WatchService 接口,这个接口是利用操作系统本身的文件监听器对目录和文件进行监控,当被监控对象发生变化时,会又信号通知,从而可以高效的发生变化。
Java代码实现
  1. 定义一个监听线程 Listener
public class Listener implements Runnable{private WatchService service; //定义WatchServiceprivate 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> 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(); } } } }

  1. 监听工具类
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:\\"); }}

    推荐阅读