很多时候我们需要监听一个文件的变化或者目录的变动,包括文件的创建、修改、删除,以及目录下文件的创建、修改和删除,在JDK7前我们只能靠轮询方式遍历目录或者定时检查文件的修改事件,这样效率非常低,性能也很差。因此在JDK7中引入了WatchService
。不过考虑到其API并不友好,于是Hutool便针对其做了简化封装,使监听更简单,也提供了更好的功能,这包括:
- 支持多级目录的监听(WatchService只支持一级目录),可自定义监听目录深度
- 延迟合并触发支持(文件变动时可能触发多次modify,支持在某个时间范围内的多次修改事件合并为一个修改事件)
- 简洁易懂的API方法,一个方法即可搞定监听,无需理解复杂的监听注册机制。
- 多观察者实现,可以根据业务实现多个
Watcher
来响应同一个事件(通过WatcherChain)
WatchMonitor
提供的事件有:
ENTRY_MODIFY
文件修改的事件ENTRY_CREATE
文件或目录创建的事件ENTRY_DELETE
文件或目录删除的事件OVERFLOW
丢失的事件
这些事件对应StandardWatchEventKinds
中的事件。
importcn.hutool.core.io.FileUtil; importcn.hutool.core.io.watch.WatchMonitor; importcn.hutool.core.io.watch.Watcher; importcn.hutool.core.lang.Console; importjava.io.File; importjava.nio.file.Path; importjava.nio.file.WatchEvent; publicclassTest { publicstaticvoidmain(String[] args) { Filefile=FileUtil.file("H:\\project\\hutool-stduy\\src\\main\\resources\\file1.txt"); //这里只监听文件或目录的修改事件WatchMonitorwatchMonitor=WatchMonitor.create(file, WatchMonitor.ENTRY_MODIFY); watchMonitor.setWatcher(newWatcher() { publicvoidonCreate(WatchEvent<?>event, PathcurrentPath) { Objectobj=event.context(); Console.log("创建:{}-> {}", currentPath, obj); } publicvoidonModify(WatchEvent<?>event, PathcurrentPath) { Objectobj=event.context(); Console.log("修改:{}-> {}", currentPath, obj); } publicvoidonDelete(WatchEvent<?>event, PathcurrentPath) { Objectobj=event.context(); Console.log("删除:{}-> {}", currentPath, obj); } publicvoidonOverflow(WatchEvent<?>event, PathcurrentPath) { Objectobj=event.context(); Console.log("Overflow:{}-> {}", currentPath, obj); } }); watchMonitor.setMaxDepth(3); watchMonitor.start(); } }
当修改文件的时候,监听器会输出:
修改:H:\project\hutool-stduy\src\main\resources->file1.txt