网站首页 > 精选教程 正文
在Java 7发布的新的IO框架中,除了大家都熟知的 FileVisitor 接口外,还有个 WatchService 接口经常被人忽视掉。 这个类可以让你实时的监控操作系统中文件的变化,包括创建、更新和删除事件。
WatchService 用来观察被注册了的对象的变化和事件。它和Watchable两个接口的配合使用, WatchService类似于在观察者模式中的观察者,Watchable类似域观察者模式中的被观察者。
而Java 7中的java.nio.file.Path类就实现了Watchable接口,这样的话,和Path类一起可实现观察者模式。
基本使用
要使用WatchService,首先必须创建一个实例,使用 java.nio.file.FileSystems 类:
WatchService watchService = FileSystems.getDefault().newWatchService();
接下来,我们初始化一个被监控文件夹的Path类:
Path path = Paths.get("pathToDir");
然后,将这个Path注册到 WatchService 中去:
WatchKey watchKey = path.register(watchService, StandardWatchEventKinds...);
注意,注册方法第二个参数是一个可变长参数,也就是可以注册多个事件类型。
StandardWatchEventKinds 有如下四种类型:
- ENTRY_CREATE 创建事件,可是新建一个文件或重命名文件
- ENTRY_MODIFY 修改事件,文件内容被修改,有些系统上面文件属性被修改也会触发
- ENTRY_DELETE 删除事件,文件被删除或被重命名
- OVERFLOW 如果丢失或放弃事件时被触发,我们一般不会关注这个类型
WatchKey
WatchKey 类代表了这个监听服务的注册,可以用它来获取事件的各个属性。一般来讲我们会通过如下方法获取这个类实例:
WatchKey watchKey = watchService.take();
这个方法会一直阻塞,知道某个事件到来。
有一点非常重要的需要记住,一旦 WatchKey 实例通过poll或take返回后,它再也不会捕获任何事件,触发你调用reset方法:
watchKey.reset();
这样的话就能将这个 WatchKey 又放回到watch service队列中去,可以重新等待新的事件了。
所以一般来讲这个服务代码形式会写成如下形式:
WatchKey key; while((key = watchService.take()) != null) { for(WatchEvent<?> event : key.pollEvents()) { //process } key.reset();
}
解释一下运行过程,take()方法会一直阻塞直到返回一个WatchKey实例,然后进入循环内部, pollEvents()方法会返回当前Key上面所有事件列表,我们一个个去处理这些事件。
所有事件处理完成后,必须调用reset方法,让这个key重新进入监听队列。
一个完整例子
下面通过一个完整例子演示WatchService的用法,我们监听用户家目录的文件变动,打印相应的信息。
package test; public class DirectoryWatcherDemo { public static void main(String[] args) { WatchService watchService = FileSystems.getDefault().newWatchService(); Path path = Paths.get("D:/Versions"); 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.kind() + ". File affected: " + event.context() + "."); } key.reset(); } } }
测试一下,在D:/Versions目录新建一个文件,然后重命名为www.doc,看看输出结果:
Event kind:ENTRY_CREATE. File affected: 新建文本文档.txt. Event kind:ENTRY_MODIFY. File affected: 新建文本文档.txt. Event kind:ENTRY_DELETE. File affected: 新建文本文档.txt. Event kind:ENTRY_CREATE. File affected: www.doc.
上面两行是新建文件输出,可以看到产生两个事件。下面是重命名产生两个事件,一个是原文件的删除事件,一个是新文件的新建事件。
猜你喜欢
- 2024-11-23 如何将本地文件提交到GitHub仓库?
- 2024-11-23 再见FTP/SFTP!是时候拥抱下一代文件传输利器Croc了
- 2024-11-23 springboot上传文件出错IOException: The temporary upload location
- 2024-11-23 Java,通过文件获取MimeType的方式,文件扩展名获取ContentType
- 2024-11-23 将20M文件从30秒压缩到1秒,我是如何做到的?
- 2024-11-23 拥抱文件传输利器 Croc
- 2024-11-23 完整教程:使用Spring Boot实现大文件断点续传及文件校验
- 2024-11-23 什么是JVM和字节码.class文件?它们的关联又是什么?
- 2024-11-23 java中oss分片上传(包含业务和详细讲解)
- 2024-11-23 JAVA全栈CMS系统vue图片/视频上传组件,多图上传及删除功能11
你 发表评论:
欢迎- 04-11Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- 04-11Java中你知道几种从字符串中找指定的字符的数量
- 04-11探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 04-11Python字符串详解与示例(python字符串的常见操作)
- 04-11java正则-取出指定字符串之间的内容
- 04-11String s1 = new String("abc");这句话创建了几个字符串对象?
- 04-11java判断字符串中是否包含某个字符
- 04-11关于java开发中正确的发牌逻辑编写规范
- 最近发表
-
- Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- Java中你知道几种从字符串中找指定的字符的数量
- 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- Python字符串详解与示例(python字符串的常见操作)
- java正则-取出指定字符串之间的内容
- String s1 = new String("abc");这句话创建了几个字符串对象?
- java判断字符串中是否包含某个字符
- 关于java开发中正确的发牌逻辑编写规范
- windows、linux如何后台运行jar(并且显示进程名)
- 腾讯大佬私人收藏,GitHub上最受欢迎的100个JAVA库,值得学习
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)