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

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

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

使用 NIO 包中的 WatchService 实现监听文件增删改

WatchService 的 简单介绍

Java 提供了WatchService 接口,这个接口是利用操作系统本身的文件监听器对目录和文件进行监控,当被监控对象发生变化时,会又信号通知,从而可以高效的发生变化。

Java代码实现

  1. 定义一个监听线程 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();
            }
        }
    }
}
  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:\\");
    }

}


你可能感兴趣的:(NIO)