怎么在JAVA中利用WatchService监控文件
今天就跟大家聊聊有关怎么在JAVA中利用WatchService监控文件,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
使用场景
场景一:比如系统中的配置文件,一般都是系统启动的时候只加载一次,如果想修改配置文件,还须重启系统。如果系统想热加载一般都会定时轮询对比配置文件是否修改过,如果修改过重新加载。
场景二:监控磁盘中的文件变化,一般需要把磁盘中的所有文件全部加载一边,定期轮询一遍磁盘,跟上次的文件状态对比。如果文件、目录过多,每次遍历时间都很长,而且还不是实时监控。
而以上两种场景就比较适合使用 WatchService 进行文件监控。
示例
import java.io.IOException;import java.nio.file.FileSystems;import java.nio.file.Paths;import java.nio.file.StandardWatchEventKinds;import java.nio.file.WatchEvent;import java.nio.file.WatchKey;import java.nio.file.WatchService;import java.util.List;public class FileWatchServiceDemo { public static void main(String[] args) throws IOException, InterruptedException { WatchService watchService = FileSystems.getDefault().newWatchService(); String filePath = "D:/aa"; Paths.get(filePath).register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_DELETE); while(true){ WatchKey key = watchService.take(); List<WatchEvent<?>> watchEvents = key.pollEvents(); for (WatchEvent<?> event : watchEvents) { if(StandardWatchEventKinds.ENTRY_CREATE == event.kind()){ System.out.println("创建:[" + filePath + "/" + event.context() + "]"); } if(StandardWatchEventKinds.ENTRY_MODIFY == event.kind()){ System.out.println("修改:[" + filePath + "/" + event.context() + "]"); } if(StandardWatchEventKinds.ENTRY_DELETE == event.kind()){ System.out.println("删除:[" + filePath + "/" + event.context() + "]"); } } key.reset(); } }}
使用 Path 来指定要监控的目录
Path.register() 方法注册要监控指定目录的那些事件(创建、修改、删除)
StandardWatchEventKinds.ENTRY_CREATE //创建 StandardWatchEventKinds.ENTRY_MODIFY //修改 StandardWatchEventKinds.ENTRY_DELETE //删除
调用watchService.take(); 获取监控目录文件的变化的WatchKey。该方法是阻塞方法,如果没有文件修改,则一直阻塞。
遍历所有的修改事件,并做相应处理。
完成一次监控就需要重置监控器。
不使用 WatchService 监控的弊端
非常繁琐,必须自己手动开启一个后台线程每隔一段时间遍历一次目标节点并记录当前状态,然后和上一次遍历的状态对比,如果不相同就表示发生了变化,再采取相应的操作,这个过程非常长,都需要用户自己手动实现;
效率低:效率都消耗在了遍历、保存状态、对比状态上了!这是因为旧版本的Java无法很好的利用OS文件系统的功能,因此只能这样笨拙地监控文件变化;
看完上述内容,你们对怎么在JAVA中利用WatchService监控文件有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网行业资讯频道,感谢大家的支持。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341