在项目开发中,经常会有这样的需求:当文件内容变动或文件目录下的文件发生变动时(文件的增删),我们需要做些监听工作或其他处理动作,如果我们自己实现这样的功能就需要写很多的代码,其实在apache中的common-io包中已经提供好了相关的工具包给我们使用,下面就简单介绍一下如何使用这个工具类。
首先,我们需要引入相关的依赖:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
接下来自定义一个类,继承FileAlterationListenerAdaptor,在这个类中重写相关的方法完成相应的处理逻辑,为了简单演示,我在示例代码中只是输出日志内容:
import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import java.io.File;
public class FileListener extends FileAlterationListenerAdaptor {
/**
* 轮询开始
*/
@Override
public void onStart(FileAlterationObserver observer) {
super.onStart(observer);
}
/**
* 轮询结束
*/
@Override
public void onStop(FileAlterationObserver observer) {
super.onStop(observer);
}
/**
* 目录创建
*/
@Override
public void onDirectoryCreate(File directory) {
super.onDirectoryCreate(directory);
System.out.println("onDirectoryCreate : " + directory.getPath() + " | " + directory.getName());
}
/**
* 目录修改
*/
@Override
public void onDirectoryChange(File directory) {
super.onDirectoryChange(directory);
System.out.println("onDirectoryChange : " + directory.getPath() + " | " + directory.getName());
}
/**
* 目录删除
*/
@Override
public void onDirectoryDelete(File directory) {
super.onDirectoryDelete(directory);
System.out.println("onDirectoryDelete : " + directory.getPath() + " | " + directory.getName());
}
/**
* 文件创建
*/
@Override
public void onFileCreate(File file) {
super.onFileCreate(file);
System.out.println("onFileCreate : " + file.getPath() + " | " + file.getName());
}
/**
* 文件修改
*/
@Override
public void onFileChange(File file) {
super.onFileChange(file);
System.out.println("onFileChange : " + file.getPath() + " | " + file.getName());
}
/**
* 文件删除
*/
@Override
public void onFileDelete(File file) {
super.onFileDelete(file);
System.out.println("onFileDelete : " + file.getPath() + " | " + file.getName());
}
}
再创建一个monitor类,用于监控指定目录或文件的变动:
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 java.io.File;
import java.util.concurrent.TimeUnit;
public class FileListenerMonitor {
private FileListenerMonitor() {
}
private static FileListenerMonitor instance;
public static final FileListenerMonitor getInstance() {
if(instance == null) {
synchronized (FileListenerMonitor.class) {
if(instance == null) {
instance = new FileListenerMonitor();
}
}
}
return instance;
}
// 设置监听路径
private final String monitorDir = "E:\\file-listener";
// 设置轮询间隔
private final long interval = TimeUnit.SECONDS.toMillis(1);
public FileAlterationMonitor getMonitor() {
// 创建过滤器
// 1. 过滤可见目录
IOFileFilter directories = FileFilterUtils.and(FileFilterUtils.directoryFileFilter(), HiddenFileFilter.VISIBLE);
// 2. 过滤以.txt结尾的文件,当该类型文件增删改时就会被监听到
IOFileFilter files = FileFilterUtils.and(FileFilterUtils.fileFileFilter(), FileFilterUtils.suffixFileFilter(".txt"));
// 两个筛选条件满足一个时就监听
IOFileFilter filter = FileFilterUtils.or(directories, files);
// 装配过滤器
FileAlterationObserver observer = new FileAlterationObserver(new File(monitorDir), filter);
// 向监听者添加监听器,并注入业务服务
observer.addListener(new FileListener());
// 返回监听者
return new FileAlterationMonitor(interval, observer);
}
}
接下来我们只需要在程序的适当位置启动monitor,就可以监控指定的目录或文件变动了。
import org.apache.commons.io.monitor.FileAlterationMonitor;
public class FileListenerTest {
public static void main(String[] args) {
try {
// 这里的业务代码要在系统启动时候就开始执行监听,并且该类都是做成单利模式,这里只是演示使用api就没有做的那么复杂
FileListenerMonitor test = FileListenerMonitor.getInstance();
FileAlterationMonitor monitor = test.getMonitor();
monitor.start();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/181857.html