zoukankan      html  css  js  c++  java
  • 【转载】java 监听文件或者文件夹变化的几种方式

    复制代码
    package com.jp.filemonitor;
    import org.apache.log4j.helpers.FileWatchdog;
    public class Log4jWatchdog {
        public static void main(String[] args) {
            GloablConfig gloablConfig = new GloablConfig("D:\create_lo\text.txt");
            gloablConfig.setDelay(10000);
            gloablConfig.start();
            while (true) {
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                
            }
        }
        public static class GloablConfig extends FileWatchdog{
            protected GloablConfig(String filename) {
                super(filename);
            }
    
            @Override
            protected void doOnChange() {
                
                System.out.println(filename);
            }
            
        }
    }
    复制代码

    2.common-io实现的文件夹变化的监听

    这代码网上很多,可以搜索关键字FileAlterationMonitor,FileAlterationObserver  FileAlterationObserver,这样就可以看到示例代码了。

    Apacha common.io2.0提供了监听文件变化的功能。

    功能由三个组件组成。

    监听器 FileAlterationListener

    用于实现文件改变时触发的行为。

    观察者 FileAlterationObserver

    用于观察文件的改变,通知注册的监听器执行相应的事件。

    监视器 FileAlterationMonitor

    通过一线程,每间隔一段时间调用一次注册的观察者检查文件。

    maven依赖

    <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.4</version>
            </dependency>

    FileAlterationListener

    通过继承FileAlterationListenerAdaptor,覆盖相应事件方法。这里只重写了文件改变。还有其他事件可以查看FileAlterationListener接口看下。

    public class FileAlterationReload extends FileAlterationListenerAdaptor {
     
        @Override
        public void onFileChange(File file) {
            System.out.println("文件改变");
        }
    }

    程序实现

    public class Demo {
     
         public static void main(String[] args) throws Exception {
             
             
             //检查classpath下properties文件夹下的properties文件。
             FileAlterationObserver fileAlterationObserver = new FileAlterationObserver(Demo.class.getClassLoader().getResource("properties").getPath(),new PropertiesFileFilter());
             
             FileAlterationListener fileAlterationListener =new FileAlterationReload();
             //注册监听器
             fileAlterationObserver.addListener(fileAlterationListener);
             FileAlterationMonitor fileAlterationMonitor = new FileAlterationMonitor();
             //注册观察者
             fileAlterationMonitor.addObserver(fileAlterationObserver);
             //启动监听
             fileAlterationMonitor.start();
             //让主线程别这么快结束。
             Thread.sleep(1000000);
     
         }
    }

    修改properties文件夹下的properties文件时,会输出 文件改变。

    应用场景

    可以用于实现配置文件的热部署 

    例子:

    https://github.com/wujiazhen2/DynamicConfigRefresh

    3.nio实现文件夹内容变化的监听

    复制代码
    package com.jp.filemonitor;
    
    
    import java.io.IOException;
    import java.nio.file.FileSystems;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    import java.nio.file.StandardWatchEventKinds;
    import java.nio.file.WatchEvent;
    import java.nio.file.WatchKey;
    import java.nio.file.WatchService;
    import java.util.List;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class ResourceListener {
        private static ExecutorService fixedThreadPool = Executors.newCachedThreadPool();
        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 Listner(ws,this.listenerPath));
        }
    
        public static void addListener(String path) throws IOException {
            ResourceListener resourceListener = new ResourceListener(path);
            Path p = Paths.get(path);
            p.register(resourceListener.ws,StandardWatchEventKinds.ENTRY_MODIFY,
                StandardWatchEventKinds.ENTRY_DELETE,
                StandardWatchEventKinds.ENTRY_CREATE);
        }
        
    
        public static void main(String[] args) throws IOException {
            ResourceListener.addListener("F:\");
            ResourceListener.addListener("d:\");
        }
    }
    
    class Listner implements Runnable {
        private WatchService service;
        private String rootPath;
        
        public Listner(WatchService service,String rootPath) {
            this.service = service;
            this.rootPath = rootPath;
        }
    
        public void run() {
            try {
                while(true){
                    WatchKey watchKey = service.take();
                    List<WatchEvent<?>> watchEvents = watchKey.pollEvents();
                    for(WatchEvent<?> event : watchEvents){
                    
                        //TODO 根据事件类型采取不同的操作。。。。。。。
                        System.out.println("["+rootPath+event.context()+"]文件发生了["+event.kind()+"]事件"+    event.count());  
                    }
                    watchKey.reset();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally{
                System.out.println("fdsfsdf");
                try {
                    service.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            
        }
    }
    复制代码
  • 相关阅读:
    NeurIPS 2018 中的贝叶斯研究
    史上最全采样方法详细解读与代码实现
    采样方法(二)MCMC相关算法介绍及代码实现
    第七十四篇:机器学习优化方法及超参数设置综述
    论文阅读:《Bag of Tricks for Efficient Text Classification》
    训练技巧详解【含有部分代码】Bag of Tricks for Image Classification with Convolutional Neural Networks
    数值分析-Legendre正交多项式 实现函数逼近
    指针生成网络(Pointer-Generator-Network)原理与实战
    强化学习入门 第五讲 值函数逼近
    UniGUI的 TUniPageControl控件动态拖动tabsheet的实现方法
  • 原文地址:https://www.cnblogs.com/appium/p/10172585.html
Copyright © 2011-2022 走看看