Java实现实时监控目录下文件变化的方法
程序员文章站
2023-12-20 21:31:22
一、commons-io方法
1、使用commons-io的monitor下的相关类可以处理对文件进行监控,它采用的是观察者模式来实现的
(1)可以监控文件夹的...
一、commons-io方法
1、使用commons-io的monitor下的相关类可以处理对文件进行监控,它采用的是观察者模式来实现的
- (1)可以监控文件夹的创建、删除和修改
- (2)可以监控文件的创建、删除和修改
- (3)采用的是观察者模式来实现的
- (4)采用线程去定时去刷新检测文件的变化情况
2、引入commons-io包,需要2.0以上。
<!-- https://mvnrepository.com/artifact/commons-io/commons-io --> <dependency> <groupid>commons-io</groupid> <artifactid>commons-io</artifactid> <version>2.6</version> </dependency>
3、编写继承filealterationlisteneradaptor的类filelistener。
import java.io.file; import org.apache.commons.io.monitor.filealterationlisteneradaptor; import org.apache.commons.io.monitor.filealterationobserver; import org.apache.log4j.logger; /** * 文件变化监听器 * 在apache的commons-io中有关于文件的监控功能的代码. 文件监控的原理如下: * 由文件监控类filealterationmonitor中的线程不停的扫描文件观察器filealterationobserver, * 如果有文件的变化,则根据相关的文件比较器,判断文件时新增,还是删除,还是更改。(默认为1000毫秒执行一次扫描) */ public class filelistener extends filealterationlisteneradaptor { private logger log = logger.getlogger(filelistener.class); /** * 文件创建执行 */ public void onfilecreate(file file) { log.info("[新建]:" + file.getabsolutepath()); } /** * 文件创建修改 */ public void onfilechange(file file) { log.info("[修改]:" + file.getabsolutepath()); } /** * 文件删除 */ public void onfiledelete(file file) { log.info("[删除]:" + file.getabsolutepath()); } /** * 目录创建 */ public void ondirectorycreate(file directory) { log.info("[新建]:" + directory.getabsolutepath()); } /** * 目录修改 */ public void ondirectorychange(file directory) { log.info("[修改]:" + directory.getabsolutepath()); } /** * 目录删除 */ public void ondirectorydelete(file directory) { log.info("[删除]:" + directory.getabsolutepath()); } public void onstart(filealterationobserver observer) { // todo auto-generated method stub super.onstart(observer); } public void onstop(filealterationobserver observer) { // todo auto-generated method stub super.onstop(observer); } }
4、实现main方法
public static void main(string[] args) throws exception{ // 监控目录 string rootdir = "d:\\apache-tomcat-7.0.78"; // 轮询间隔 5 秒 long interval = timeunit.seconds.tomillis(1); // 创建过滤器 iofilefilter directories = filefilterutils.and( filefilterutils.directoryfilefilter(), hiddenfilefilter.visible); iofilefilter files = filefilterutils.and( filefilterutils.filefilefilter(), filefilterutils.suffixfilefilter(".txt")); iofilefilter filter = filefilterutils.or(directories, files); // 使用过滤器 filealterationobserver observer = new filealterationobserver(new file(rootdir), filter); //不使用过滤器 //filealterationobserver observer = new filealterationobserver(new file(rootdir)); observer.addlistener(new filelistener()); //创建文件变化监听器 filealterationmonitor monitor = new filealterationmonitor(interval, observer); // 开始监控 monitor.start(); }
二、使用jdk7提供的watchservice
public static void main(string[] a) { final path path = paths.get("d:\\apache-tomcat-7.0.78"); try (watchservice watchservice = filesystems.getdefault().newwatchservice()) { //给path路径加上文件观察服务 path.register(watchservice, standardwatcheventkinds.entry_create, standardwatcheventkinds.entry_modify, standardwatcheventkinds.entry_delete); while (true) { final watchkey key = watchservice.take(); for (watchevent<?> watchevent : key.pollevents()) { final watchevent.kind<?> kind = watchevent.kind(); if (kind == standardwatcheventkinds.overflow) { continue; } //创建事件 if (kind == standardwatcheventkinds.entry_create) { system.out.println("[新建]"); } //修改事件 if (kind == standardwatcheventkinds.entry_modify) { system.out.println("修改]"); } //删除事件 if (kind == standardwatcheventkinds.entry_delete) { system.out.println("[删除]"); } // get the filename for the event final watchevent<path> watcheventpath = (watchevent<path>) watchevent; final path filename = watcheventpath.context(); // print it out system.out.println(kind + " -> " + filename); } boolean valid = key.reset(); if (!valid) { break; } } } catch (ioexception | interruptedexception ex) { system.err.println(ex); } }
三、以上方法都可以实现对相应文件夹得文件监控,但是在使用jdk7提供的api时,会出现些许问题。
- (1)当文件修改时,会被调用两次,即输出两个相同的修改。
- (2)不能对其子文件夹进行监控,只能提示目录被修改。
- (3)无法对文件类型进行过滤。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接