【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(); } }
欢迎访问我的个人博客站点:
https://yeyeck.com