Java NIO2包WatchService解析与运用

2021-04-12 14:45:20 浏览数 (1)

背景

我们在用IDE写代码,或者某些文本编辑器的时候,在外部如果修改了这个文件,通常这些编辑器都能感知到,有些还会提示你是否要重新加载,例如notepad :

这些特性都是基于文件系统的文件变化通知实现的。我们可以通过一些方式监控某些文件或者文件夹的变化,但是很难做到Scalable

Java7之后的NIO2包的WatchService提供了一种Scalable的方式监控文件与文件夹变化

代码解析

代码语言:javascript复制
public class WatchServiceFirst {
    public static void main(String[] args) throws IOException, InterruptedException {

        WatchService watchService = FileSystems.getDefault().newWatchService();
        Path path = Paths.get("D:\apache-jmeter-3.3\bin");

        //注册需要监听的事件
        path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.OVERFLOW);

        WatchKey key;
        while ((key = watchService.take()) != null) {
            for (WatchEvent event : key.pollEvents()) {
                System.out.println(
                        "Event kind:"   event.kind()
                                  ". File affected: "   event.context()   ".");
            }
            key.reset();
        }
    }
}

四种监听事件:

StandardWatchEventKinds.ENTRY_CREATE

文件创建

StandardWatchEventKinds.ENTRY_DELETE

文件删除

StandardWatchEventKinds.ENTRY_MODIFY

文件修改

StandardWatchEventKinds.OVERFLOW

事件丢失,一般不关注

这里的event.context()是相对路径并且,只能监控当前目录下的,也就是说你在其中一个子目录下创建文件或者文件夹,都是只会返回这个目录的修改事件。

0 人点赞