Java WatchService文件变更监听

问:如何使用快速实现Java文件变更监听?
答:WatchService接口。WatchService是JDK 7提供的接口,其实现了Closeable,可采用try...with方式关闭。
注:WatchService监听的是目录,而不是某个文件为基准。

示例代码:
import java.io.File;
import java.io.IOException;
import java.nio.file.*;
import java.util.Objects;

public static void main(String[] args) {
        final String fileName = "testText.txt";
        final String filePath = "C:\\Users\\admin\\Desktop\\testText.txt";
        File file = new File(filePath);
        String parent = file.getParent();
        System.out.println(parent); // 获取到的是目录

        // 注册监听服务
        WatchService watchService;
        try {
            watchService = FileSystems.getDefault().newWatchService();
            Path path = Paths.get(parent);
            WatchKey wk = path.register(watchService,
                    StandardWatchEventKinds.ENTRY_MODIFY,
                    StandardWatchEventKinds.ENTRY_DELETE);
            System.out.println(wk); // 只做断点看看
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }

        // 监听修改线程:目录下的所有监听项都会在这里响应,所以要根据文件名来区分
        Thread wThread = new Thread(() -> {
            while (true) {
                try {
                    WatchKey watchKey = watchService.take();
                    for (WatchEvent<?> pollEvent : watchKey.pollEvents()) {

                        String eventName = pollEvent.context().toString();
                        System.out.println(eventName);
                        if (Objects.equals(eventName, fileName)) {
                            System.out.println("检测到变更");
                            // TODO 此处进行重新读取文件并处理,coding。。。
                            break;
                        }
                    }
                    watchKey.reset(); // 必须重置监视Key

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        // wThread.setDaemon(true); // 守护进程
        wThread.start();

        // 注册关闭钩子
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            try {
                watchService.close();
                System.out.println("文件监听钩子已关闭");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }));

    }

本文参考:京东张开涛老师《亿级流量网站架构核心技术》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 古语有云: 道为术之灵,术为道之体;以道统术,以术得道。 其中:“道”指“规律、道理、理论”,“术”指“方法、技巧...
    Java码农石头阅读 2,523评论 0 0
  • 作者常意 内容来自微信公众号 天池大数据科研平台此处仅供本人学习记录之用,侵删 前言 古语有云: 道为术之灵,术为...
    longLiveData阅读 1,228评论 0 0
  • Java继承关系初始化顺序 父类的静态变量-->父类的静态代码块-->子类的静态变量-->子类的静态代码快-->父...
    第六象限阅读 6,454评论 0 9
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 14,467评论 2 59
  • 第一章:Java程序设计概述 Java和C++最大的不同在于Java采用的指针模型可以消除重写内存和损坏数据的可能...
    loneyzhou阅读 5,034评论 1 7