zoukankan      html  css  js  c++  java
  • 【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();
        }
    }
  • 相关阅读:
    HDU 2639 Bone Collector II (01背包,第k解)
    POJ 2184 Cow Exhibition 奶牛展(01背包,变形)
    hihoCoder #1165 : 益智游戏 (挑战赛11 B题)
    UVA 562 Dividing coins 分硬币(01背包,简单变形)
    POJ Charm Bracelet 挑饰品 (常规01背包)
    hiho一下 第四十四周 博弈游戏·Nim游戏(直接公式解)
    UVA 624 CD(01背包,要记录路径)
    118 Pascal's Triangle 帕斯卡三角形 杨辉三角形
    117 Populating Next Right Pointers in Each Node II 每个节点的右向指针 II
    116 Populating Next Right Pointers in Each Node 每个节点的右向指针
  • 原文地址:https://www.cnblogs.com/yeyeck/p/11089536.html
Copyright © 2011-2022 走看看