Java实时监控指定目录下文件、文件夹的创建、修改、删除操作之commons-io封装,拿来就能用

345人浏览 / 0人评论

上一篇:Java实时监控指定目录下文件、文件夹的创建、修改、删除操作之commons-io,介绍了使用commons-io实现对指定目录下文件、文件夹的创建、修改、删除操作的实时监听。本篇在上一篇的基础上做了进一步封装,拿来就能用。

1、新建文件监听工具类,对外提供开启监听方法

import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.commons.io.monitor.FileAlterationListener;
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 FileMonitor {

    /**
     * 启动监听目录下的文件变化
     * @param dirPath
     * @throws Exception
     */
    public static void startMonitor(String dirPath, FileAlterationListener fileAlterationListener) throws Exception {
        if (dirPath == null || !new File(dirPath).exists()) {
            throw new RuntimeException("监听目录[" + dirPath + "]不存在!");
        }

        // 轮询间隔 1 秒
        long interval = TimeUnit.SECONDS.toMillis(1);
        // 创建过滤器
        IOFileFilter docFileFilter = FileFilterUtils.and(FileFilterUtils.fileFileFilter(), FileFilterUtils.suffixFileFilter(".doc"));
        IOFileFilter docxFileFilter = FileFilterUtils.and(FileFilterUtils.fileFileFilter(), FileFilterUtils.suffixFileFilter(".docx"));
        IOFileFilter fileFilter = FileFilterUtils.or(docFileFilter, docxFileFilter);

        // 使用过滤器
        FileAlterationObserver observer = new FileAlterationObserver(new File(dirPath), fileFilter);
        //不使用过滤器
//        FileAlterationObserver observer = new FileAlterationObserver(new File(rootDir));
        observer.addListener(fileAlterationListener);
        //创建文件变化监听器
        FileAlterationMonitor monitor = new FileAlterationMonitor(interval, observer);
        // 开始监控
        monitor.start();
    }

}

任何地方调用这个方法只需传入2个参数:dirPath、fileAlterationListener。

String downloadDirPath = "E:\\111111\\download";
FileMonitor.startMonitor(downloadDirPath, new FileAlterationListenerAdaptor() {
	// 下载会先创建文件,下载完成再修改文件,这里监听文件改变事件就行了
	@Override
	public void onFileChange(File file) {
		System.out.println(new Date().toLocaleString() + "--->[" + file.getAbsolutePath() + "] 下载完成!");
	}
});

FileAlterationListenerAdaptor实现了FileAlterationListener接口,只不过都是空实现。这样我们继承这个类或创建这个类的匿名内部类,只需要重写我们关注的事件方法即可。

全部评论