前言
有时候你可能有个疑问,IDE总是可以检测到外部文件是否发生了变化,比如你在某个类里面加了一些代码,这时候的IDE就会弹出一个框说你做了更改。再或者是某个文件夹下的文件发生了改变,比如新建了一个或者是删除了一个等等。这时候我们的IDE依然可以检测到。这个功能到底是如何实现的呢?这篇文章主要是研究NIO的其中一个类,叫做WatchService。
也有一些其他的方式可以轻松地实现监控文件夹的功能,比如说java轮询的方式,或者是common-io的方式,我会慢慢比较。
OK,我们直接来看一下简单例子如何实现,再去分析如何实现的?
一、代码实现1、简单案例
这个代码很简单,只需要四步:
- public static void main(String[] args) throws Exception {
- //第一步:取得WatchService
- WatchService watchService = FileSystems.getDefault().newWatchService();
- //第二步:确定要监控的路径
- Path path = Paths.get("G:\\");
- //第三步:为本路径绑定WatchService,并确定监控的事件
- path.register(
- watchService,
- StandardWatchEventKinds.ENTRY_CREATE,
- StandardWatchEventKinds.ENTRY_DELETE,
- StandardWatchEventKinds.ENTRY_MODIFY);
- WatchKey key;
- //第四步:当有事件时,开始触发
- while ((key = watchService.take()) != null) {
- for (WatchEvent<?> event : key.pollEvents()) {
- System.out.println("事件" + event.kind() + "发生了,文件是:" + event.context());
- }
- key.reset();
- }
- }
这里我们监控G盘,然后我们在G盘新建文件,然后删除修改,就会在后台打印相关信息。
现在就可以监控了,很简单。
2、代码分析
第一步和第二步,新建一个取得WatchService和取得要监控的路径,这个很容易理解。
第三步绑定,这里只需要注意两件重要的事情:首先,path将watchService作为第一个参数,然后是StandardWatchEventKinds的变量参数。一共有四种。
第四步不断监控,当watchService里面不为空时,开始获取相应的事件,并poll弹出。最后还有一个reset 表示回退到相应的句柄,继续处理下一次事件。
3、源码分析
由于watchService是一个接口,所以分析起来也比较简单。里面一共包含了三个方法
- //方法1:关闭watchService
- @Override
- void close() throws IOException;
- //方法2:弹出事件
- WatchKey poll();
- //方法3:带有参数的弹出
- WatchKey poll(long timeout, TimeUnit unit)
- throws InterruptedException;
- //方法4:获取事件。
- WatchKey take() throws InterruptedException;
由于方法比较简单,所以我们可以直接看方法上的注释就可以了。
结论
WatchService接口是在java7的版本中引入的。主要是处理NIO的文件相关问题。但是WatchService其实是有很多缺点的。
WatchService是采用扫描式的,效率低。
WatchService代码写起来费劲。虽然上面看起来很简洁了,但是实际开发时麻烦。
WatchService不能监听到多级目录,事先父文件夹需要存在。
鉴于以上原因,在简单的实现时,可以使用,但是还有一个更强大的工具commons-io,使用更简单也更加的高效。下篇文章给出。
信息化2.0时代提出开展智慧教育创新发展行动。2019年2月,中共中央、国务院印发...
Docker生成新镜像版本的两种方式 There are two ways Docker can generate new m...
在Python语言中有如下3种方法: 成员方法 类方法(classmethod) 静态方法(staticm...
2021年3月24日,主题为《数据的世界,世界的数据》的星环科技2021春季新品发布会...
建站 什么 虚拟主机 够用?这要看搭建的是什么类型的网站。比如个人博客类型的网...
前提条件 请您在购买前确保已完成注册和充值。详细操作请参见 如何注册公有云管...
摘要 元旦期间 订单业务线 告知 推送系统 无法正常收发消息,作为推送系统维护者...
本文整理自直播《Hologres 数据导入/导出实践-王华峰(继儒)》 视频链接: https:/...
【51CTO.com快译】 数据可视化工具不断发展,提供更强大的功能,同时改善可访问...
从 10.0.0 版开始,异步迭代器就出现在 Node 中了,在本文中,我们将讨论异步迭...