zoukankan      html  css  js  c++  java
  • 利用WatchService监听文件变化

    在实现配置中心的多种方案中,有基于JDK7+的WatchService方法,其在单机应用中还是挺有实践的意义的。

    代码如下:

    package com.longge.mytest;
    
    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;
    
    /**
     * 测试JDK的WatchService监听文件变化
     * @author yangzhilong
     *
     */
    public class TestWatchService {
        public static void main(String[] args) throws IOException {
            // 需要监听的文件目录(只能监听目录)
            String path = "d:/test";
            
            WatchService watchService = FileSystems.getDefault().newWatchService();
            Path p = Paths.get(path);
            p.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY,  
                    StandardWatchEventKinds.ENTRY_DELETE,  
                    StandardWatchEventKinds.ENTRY_CREATE);  
            
            Thread thread = new Thread(() -> {
                try {  
                    while(true){  
                        WatchKey watchKey = watchService.take();  
                        List<WatchEvent<?>> watchEvents = watchKey.pollEvents();  
                        for(WatchEvent<?> event : watchEvents){  
                            //TODO 根据事件类型采取不同的操作。。。。。。。  
                            System.out.println("["+path+"/"+event.context()+"]文件发生了["+event.kind()+"]事件");    
                        }  
                        watchKey.reset();  
                    }  
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                }
            });
            thread.setDaemon(false);
            thread.start();
            
            // 增加jvm关闭的钩子来关闭监听
            Runtime.getRuntime().addShutdownHook(new Thread(() -> {
                try {
                    watchService.close();
                } catch (Exception e) {
                }
            }));
        }
    }

    运行示例结果类似如下:

    [d:/test/1.txt]文件发生了[ENTRY_MODIFY]事件
    [d:/test/1.txt]文件发生了[ENTRY_DELETE]事件
    [d:/test/新建文本文档.txt]文件发生了[ENTRY_CREATE]事件
    [d:/test/新建文本文档.txt]文件发生了[ENTRY_DELETE]事件
    [d:/test/222.txt]文件发生了[ENTRY_CREATE]事件
  • 相关阅读:
    OpenCV运动检测跟踪(blob track)框架组成模块详解
    C# 控制台应用程序中输出彩色字体
    C#获取隐藏的文件
    用c#怎么比较两张图片的不同
    清除浏览器缓存
    C#判断系统是否已经连接上网络
    如何删除VS2005中显示的最近项目
    设计模式:模板方法模式(Template Method)
    【SQL】数据库对象中查找某一关键字
    【问答】.NET面试题
  • 原文地址:https://www.cnblogs.com/yangzhilong/p/7487220.html
Copyright © 2011-2022 走看看