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();
        }
    }
  • 相关阅读:
    小程序 scroll-view 中文字不换行问题
    模块
    网络编程
    元类
    day24
    day23
    day22
    day21
    day18
    day17
  • 原文地址:https://www.cnblogs.com/yeyeck/p/11089536.html
Copyright © 2011-2022 走看看