org.apache.commons.io包
使用Commons-io的 monitor 下的相关类可以处理对文件进行监控,它采用的是观察者模式来实现的。
- 可以监控文件夹的创建、删除和修改
- 可以监控文件的创建、删除和修改
- 采用的是观察者模式来实现的
- 采用线程去定时去刷新检测文件的变化情况
下面是在SpringBoot环境的应用:
1、引入commons-io包,需要2.0以上
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
2,编写继承FileAlterationListenerAdaptor的类ListenerAdaptor文件变化监听器
在Apache的Commons-IO中有关于文件的监控功能的代码. 文件监控的原理如下:
- 由文件监控类FileAlterationMonitor中的线程不停的扫描文件观察器FileAlterationObserver,
- 如果有文件的变化,则根据相关的文件比较器,判断文件时新增,还是删除,还是更改。(默认为1000毫秒执行一次扫描)
package com.test.service.MyService;
import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.io.File;
/**
* @author selfimpr626
*/
@Component
public class ListenerAdaptor extends FileAlterationListenerAdaptor {
/**
* 业务
**/
@Resource(name = "myServiceImpl")
private MyServiceImpl myService;
/**
* 目录创建
**/
@Override
public void onDirectoryCreate(File directory) {
System.out.println("创建新目录");
}
/**
* 目录修改
**/
@Override
public void onDirectoryChange(File directory) {
System.out.println("目录修改");
}
/**
* 目录删除
**/
@Override
public void onDirectoryDelete(File directory) {
System.out.println("目录删除");
}
/**
* 文件创建(对于文件名的修改,会先触发文件新增方法,再触发文件删除方法)
**/
@Override
public void onFileCreate(File file) {
myService.createFile(file);
System.out.println("文件创建:" + file);
}
/**
* 文件修改
**/
@Override
public void onFileChange(File file) {
System.out.println("文件修改");
}
/**
* 文件创建删除
**/
@Override
public void onFileDelete(File file) {
System.out.println("删除文件:" + file);
}
/**
* 扫描开始
**/
@Override
public void onStart(FileAlterationObserver observer) {
}
/**
* 扫描结束
**/
@Override
public void onStop(FileAlterationObserver observer) {
}
}
3,开启文件监听,点击进入此处的@PostConstruct注解解析
package com.test;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.HiddenFileFilter;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.springframework.beans.factory.annotation.Autowired;
import javax.annotation.PostConstruct;
import java.io.File;
import java.util.concurrent.TimeUnit;
/**
* @author selfimpr626
*/
public class ListenerServer {
@Autowired
private ListenerAdaptor listenerAdaptor;
@PostConstruct
public void executeListener(){
// 设置监控目录
String monitorDir = "D:\\test\\file";
// 设置扫描间隔
long interval = TimeUnit.SECONDS.toMillis(5);
// 创建过滤器
// 匹配目录
IOFileFilter directories = FileFilterUtils.and(FileFilterUtils.directoryFileFilter(), HiddenFileFilter.VISIBLE);
// 匹配txt后缀文件
IOFileFilter files = FileFilterUtils.and(FileFilterUtils.fileFileFilter(),
FileFilterUtils.suffixFileFilter(".txt"));
// 过滤符合:对应可视目录 和 后缀为".txt"的文件
IOFileFilter filter = FileFilterUtils.or(directories, files);
// 使用过滤器:装配过滤器,生成监听者
FileAlterationObserver observer = new FileAlterationObserver(new File(monitorDir), filter);
// 不使用过滤器的情况
//FileAlterationObserver observer = new FileAlterationObserver(new File(monitorDir));
// 向监听者添加监听器,并注入业务服务
observer.addListener(listenerAdaptor);
// 创建文件变化监听器
FileAlterationMonitor fileAlterationMonitor = new FileAlterationMonitor(interval, observer);
try {
// 开启监听
fileAlterationMonitor.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
另外:还可以应用File Watch Service方式,启一个Listener监听器,去监测某个目录下的文件变动
https://blog.csdn.net/weixin_41888813/article/details/84859670