• 【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();
        }
    }
  • 相关阅读:
    生成排列与生成子集
    赛后总结AtCoder Beginner Contest 090(Beginner)
    树状数组笔记
    论怎么记住tarjan的板子
    tarjan缩点-受欢迎的牛-笔记
    tarjan模板(%%%hzwer)-2.0
    tarjan模板(%%%hzwer)
    匈牙利算法学习笔记
    最短路-Car的旅行路线
    数据结构 笔记1 搜索树
  • 原文地址:https://www.cnblogs.com/yeyeck/p/11089536.html
Copyright © 2020-2023  润新知