【JavaSE】文件监听器 WatchService

一、遇到的场景

  项目中有两个APP,部署在同一个机器上,A在实现一个功能的时候,需要B去做一些事情,除此之外两个APP之间没有其他交流。

一开始考虑用socket,但是觉得socket太繁琐而且有点大材小用。最后决定用文件监听器,实现简单而且由于这个功能由操作系统提供,很可靠。

 

二、关于WatchService。

  它的介绍我就不多说了。简单地说就是一个文件监听器,可以监听文件夹下所有的文件动作:创建、修改、删除。这个功能是操作系统提供的。WatchService也只是调用了操作系统资源。

 

三、Sample

import java.io.IOException;
import java.nio.file.*;
import java.util.List;

public class Watcher implements Runnable{

    private String filePath;

    private WatchService watchService;

    public Watcher(String filePath) {
        this.filePath = filePath;
    }

    @Override
    public void run() {
        try {
            this.watchService = FileSystems.getDefault().newWatchService();
            Path path = Paths.get(filePath);
            path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.OVERFLOW);
            printLog("开始监听文件夹:{}", filePath);
            WatchKey key;
            while ((key=watchService.take()) != null) {
                List<WatchEvent<?>> watchEvents = key.pollEvents();
                for(WatchEvent<?> watchEvent : watchEvents) {
                    WatchEvent.Kind<?> kind = watchEvent.kind();
                    if (kind == StandardWatchEventKinds.ENTRY_CREATE) {
                        printLog("新建文件: {}, 次数: {}", watchEvent.context(), watchEvent.count());
                    } else if (kind == StandardWatchEventKinds.ENTRY_DELETE) {
                        printLog("删除文件: {}, 次数: {}", watchEvent.context(), watchEvent.count());
                    } else if (kind == StandardWatchEventKinds.ENTRY_MODIFY) {
                        printLog("修改文件: {}, 次数: {}", watchEvent.context(), watchEvent.count());
                    } else if (kind == StandardWatchEventKinds.OVERFLOW) {
                        printLog("overflow: {}, 次数: {}", watchEvent.context(), watchEvent.count());
                    }
                }
                key.reset();
            }

        } catch (IOException e) {
            System.out.println("获取监听器失败");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private void printLog(String format, Object...objects) {
        format = format.replaceAll("\\{\\}", "%s");
        System.out.println(String.format(format,objects));
    }


    public static void main(String[] args) {
        new Thread(new Watcher("D:\\tmp")).start();
    }
}

 

posted @ 2019-06-26 14:10  早起的虫儿去吃鸟  阅读(1144)  评论(0编辑  收藏  举报