文档章节

使用Hutool监听文件变化

路小磊
 路小磊
发布于 03/23 18:48
字数 809
阅读 598
收藏 16
点赞 0
评论 2

由来

很多时候我们需要监听一个文件的变化或者目录的变动,包括文件的创建、修改、删除,以及目录下文件的创建、修改和删除,在JDK7前我们只能靠轮询方式遍历目录或者定时检查文件的修改事件,这样效率非常低,性能也很差。因此在JDK7中引入了WatchService。不过考虑到其API并不友好,于是Hutool便针对其做了简化封装,使监听更简单,也提供了更好的功能,这包括:

  • 支持多级目录的监听(WatchService只支持一级目录),可自定义监听目录深度
  • 延迟合并触发支持(文件变动时可能触发多次modify,支持在某个时间范围内的多次修改事件合并为一个修改事件)
  • 简洁易懂的API方法,一个方法即可搞定监听,无需理解复杂的监听注册机制。
  • 多观察者实现,可以根据业务实现多个Watcher来响应同一个事件(通过WatcherChain)

WatchMonitor

在Hutool中,WatchMonitor主要针对JDK7中WatchService做了封装,针对文件和目录的变动(创建、更新、删除)做一个钩子,在Watcher中定义相应的逻辑来应对这些文件的变化。

内部应用

在hutool-setting模块,使用WatchMonitor监测配置文件变化,然后自动load到内存中。WatchMonitor的使用可以避免轮询,以事件响应的方式应对文件变化。

使用

WatchMonitor提供的事件有:

  • ENTRY_MODIFY 文件修改的事件
  • ENTRY_CREATE 文件或目录创建的事件
  • ENTRY_DELETE 文件或目录删除的事件
  • OVERFLOW 丢失的事件

这些事件对应StandardWatchEventKinds中的事件。

下面我们介绍WatchMonitor的使用:

监听指定事件

File file = FileUtil.file("example.properties");
//这里只监听文件或目录的修改事件
WatchMonitor watchMonitor = WatchMonitor.create(file, WatchMonitor.ENTRY_MODIFY);
watchMonitor.setWatcher(new Watcher(){
	@Override
	public void onCreate(WatchEvent<?> event, Path currentPath) {
		Object obj = event.context();
		Console.log("创建:{}-> {}", currentPath, obj);
	}

	@Override
	public void onModify(WatchEvent<?> event, Path currentPath) {
		Object obj = event.context();
		Console.log("修改:{}-> {}", currentPath, obj);
	}

	@Override
	public void onDelete(WatchEvent<?> event, Path currentPath) {
		Object obj = event.context();
		Console.log("删除:{}-> {}", currentPath, obj);
	}

	@Override
	public void onOverflow(WatchEvent<?> event, Path currentPath) {
		Object obj = event.context();
		Console.log("Overflow:{}-> {}", currentPath, obj);
	}
});

//设置监听目录的最大深入,目录层级大于制定层级的变更将不被监听,默认只监听当前层级目录
watchMonitor.setMaxDepth(3);
//启动监听
watchMonitor.start();

监听全部事件

其实我们不必实现Watcher的所有接口方法,Hutool同时提供了SimpleWatcher类,只需重写对应方法即可。

同样,如果我们想监听所有事件,可以:

WatchMonitor.createAll(file, new SimpleWatcher(){
	@Override
	public void onModify(WatchEvent<?> event, Path currentPath) {
		Console.log("EVENT modify");
	}
}).start();

createAll方法会创建一个监听所有事件的WatchMonitor,同时在第二个参数中定义Watcher来负责处理这些变动。

延迟处理监听事件

在监听目录或文件时,如果这个文件有修改操作,JDK会多次触发modify方法,为了解决这个问题,我们定义了DelayWatcher,此类通过维护一个Set将短时间内相同文件多次modify的事件合并处理触发,从而避免以上问题。

WatchMonitor monitor = WatchMonitor.createAll("d:/", new DelayWatcher(watcher, 500));
monitor.start();

© 著作权归作者所有

共有 人打赏支持
路小磊

路小磊

粉丝 279
博文 53
码字总数 39918
作品 5
乌海
程序员
加载中

评论(2)

路小磊
路小磊

引用来自“疯狂的逍遥”的评论

把jwt加上把

jwt最好引入专门的库。这个后续有时间考虑
疯狂的逍遥
疯狂的逍遥
把jwt加上把
Hutool 3.1.1 跨越发布,Java 工具集

Hutool 是一个Java工具包,提供了丰富的文件、日期、日志、正则、字符串、配置文件等工具方法,并封装了一套简单易用的ORM框架。 主页:http://hutool.cn/ 文档:http://hutool.mydoc.io/ (...

路小磊
2017/09/13
775
40
Hutool 2.16.0 发布,Java 工具集

Hutool 2.16.0 发布了。Hutool 是一个Java工具包,提供了丰富的文件、日期、日志、正则、字符串、配置文件等工具方法,并封装了一套简单易用的ORM框架。 新特性 Conver类变为Convert类 增加H...

路小磊
2016/12/30
1K
20
Hutool 3.0.7 发布,Java 工具集

Hutool 是一个Java工具包,提供了丰富的文件、日期、日志、正则、字符串、配置文件等工具方法,并封装了一套简单易用的ORM框架。 主页:http://hutool.cn/ 文档:http://hutool.mydoc.io/ (...

路小磊
2017/06/15
1K
24
Java工具集-hutool 2.5.0发布

Hutool 是一个Java工具包,提供了丰富的文件、日期、日志、正则、字符串、配置文件等工具方法,并封装了一套简单易用的ORM框架。 2.5.0 更新内容: 1. 谢谢@红书 提的bug,修复了在实体类转P...

路小磊
2015/03/25
3.5K
37
Hutool 2.15.8 发布,Java 工具集

Hutool 2.15.8 发布了。Hutool 是一个Java工具包,提供了丰富的文件、日期、日志、正则、字符串、配置文件等工具方法,并封装了一套简单易用的ORM框架。 更新内容: 1、修复Http编码问题 2、...

路小磊
2016/09/07
2.1K
10
hutool 2.15.2 发布,Java 工具集

Hutool 是一个Java工具包,提供了丰富的文件、日期、日志、正则、字符串、配置文件等工具方法,并封装了一套简单易用的ORM框架。 更新内容: ● 修复SqlBuilder中 Order不支持多字段多向排序...

路小磊
2016/06/06
2.7K
6
hutool 2.7.2 发布,Java 工具集

Hutool 是一个Java工具包,提供了丰富的文件、日期、日志、正则、字符串、配置文件等工具方法,并封装了一套简单易用的ORM框架。 改进内容如下: 增加SqlBuilder 增加HttpUtil.request方法 ...

路小磊
2015/04/14
4.6K
16
hutool 2.8.1 发布,Java 工具集

Hutool 是一个Java工具包,提供了丰富的文件、日期、日志、正则、字符串、配置文件等工具方法,并封装了一套简单易用的ORM框架。 改进内容如下: SecureUtil中增加mac算法的加密 2. 增加针对...

路小磊
2015/05/06
2.1K
20
Java 工具集-Hutool

Hutool是一个Java工具集,针对我们项目中util包进行开刀,抽象大量的工具方法,旨在减少项目中工具类的数量,将我们的编码工作专注在业务上。Hutool 对文件、流、加密解密、转码、正则、线程...

路小磊
2014/04/17
21.2K
31
Hutool 2.15.15 发布,Java 工具集

Hutool 2.15.8 发布了。Hutool 是一个Java工具包,提供了丰富的文件、日期、日志、正则、字符串、配置文件等工具方法,并封装了一套简单易用的ORM框架。 ----------------------- 1024 -----...

路小磊
2016/10/24
2.2K
11

没有更多内容

加载失败,请刷新页面

加载更多

下一页

tomcat虚拟路径的几种配置方法

tomcat虚拟路径的几种配置方法 一般我们都是直接引用webapps下面的web项目,如果我们要部署一个在其它地方的WEB项目,这就要在TOMCAT中设置虚拟路径了,Tomcat的加载web顺序是先加载 $Tomcat_ho...

Helios51
10分钟前
1
0
Mac 安装jupyter notebook的过程

MAC台式机 python:mac下自带Python 2.7.10 1.先升级了pip安装工具:sudo python -m pip install --upgrade --force pip 2.安装setuptools 工具:sudo pip install setuptools==33.1.1 3.安装......

火力全開
15分钟前
0
0
导航守卫解释与例子

“导航”表示路由正在发生改变。 正如其名,vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航。有多种机会植入路由导航过程中:全局的, 单个路由独享的, 或者组件级的。 记住...

tianyawhl
15分钟前
0
0
Java日志框架-logback配置文件多环境日志配置(开发、测试、生产)(原始解决方法)

说明:这种方式应该算是最通用的,原理是通过判断标签实现。 <!-- if-then form --> <if condition="some conditional expression"> <then> ... </then> </if> ......

浮躁的码农
30分钟前
1
0
FTP传输时的两种登录方式和区别

登录方式 匿名登录 用户名为: anonymous。 密码为:任何合法 email 地址。 授权登录 用户名为:用户在远程系统中的用户帐号。 密码为:用户在远程系统中的用户密码。 区别 匿名登录 只能访问...

寰宇01
31分钟前
0
0
plsql developer 配置监听(不安装oracle客户端)

plsql developer 配置监听(不安装oracle客户端)

微小宝
38分钟前
1
0
数据库(分库分表)中间件对比

本人的宗旨就是,能copy的,绝对不手写。 分区:对业务透明,分区只不过把存放数据的文件分成了许多小块,例如mysql中的一张表对应三个文件.MYD,MYI,frm。 根据一定的规则把数据文件(MYD)和索...

奔跑吧代码
42分钟前
2
0
Netty与Reactor模式详解

在学习Reactor模式之前,我们需要对“I/O的四种模型”以及“什么是I/O多路复用”进行简单的介绍,因为Reactor是一个使用了同步非阻塞的I/O多路复用机制的模式。 I/O的四种模型 I/0 操作 主要...

hutaishi
48分钟前
1
0
【2018.07.16学习笔记】【linux高级知识 20.16-20.19】

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析

lgsxp
53分钟前
0
0
用 D3.js 画一个手机专利关系图, 看看苹果,三星,微软间的专利纠葛

用 D3.js 画一个手机专利关系图, 看看苹果,三星,微软间的专利纠葛 前言 本文灵感来源于Mike Bostock 的一个 demo 页面 原 demo 基于 D3.js v3 开发, 笔者将其使用 D3.js v5 进行重写, 并改为...

ssthouse_hust
57分钟前
23
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部