java实现监听目录下所有文件和文件夹下的文件

有个面试题,大概讲的是监听目录下所有文件包括文件夹下的文件夹下的文件,递归,
主要使用了common-io包,maven依赖如下:

  <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
    <dependencies>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
    </dependency>

java测试代码如下,使用main方法执行即可:
filefilter具体类的作用参见:https://blog.csdn.net/qq_38366063/article/details/89263325

 public static void questionTwo() {
        // 监控目录
        String rootDir = "E:\test\A\";
        // 轮询间隔 3 秒
        long interval = TimeUnit.SECONDS.toMillis(3);

        //遍历根目录下所有文件
        Collection<File> listFiles = FileUtils.listFiles(new File(rootDir),
                FileFilterUtils.suffixFileFilter(".jpg"), DirectoryFileFilter.DIRECTORY);
        for (File file : listFiles) {
            System.out.println(file.getName());
        }

        //不使用过滤器,就会监听目录下所有文件,目录(包括子文件里面的改动)
//        FileAlterationObserver observer = new FileAlterationObserver(
//               new File(rootDir));

        //rootDir,选定路径,只会监听当前路径下的文件以.jpg结尾的文件,不包括子目录下文件
        FileAlterationObserver observer = new FileAlterationObserver(
                rootDir,
                FileFilterUtils.and(
                       FileFilterUtils.fileFileFilter(),
                        FileFilterUtils.suffixFileFilter(".jpg")));
        observer.addListener(new MyFileListener());
        FileAlterationMonitor monitor = new FileAlterationMonitor(interval,observer);
        // 开始监控
        try {
            monitor.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

MyFileListener监听类,我这里是监听到A文件夹如果增加了文件,就会复制到B文件夹:

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationObserver;

import java.io.*;

/**
 * 自定义文件监听器
 */
public class MyFileListener extends FileAlterationListenerAdaptor {

    public static final String rootDir = "E:\test\B\";

    @Override
    public void onFileCreate(File file) {
        System.out.println("[新建]:" + file.getAbsolutePath());
        String absolutePath = file.getParent();
        String[] split = absolutePath.split("\\");
        int length = split.length;
        try {
            File file1 = new File(rootDir + split[length - 3] + "_" + split[length - 2] + "_" + split[length - 1] + "_" + file.getName().substring(file.getName().lastIndexOf('.')));
            FileUtils.copyFile(file, file1);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void onFileChange(File file) {
        System.out.println("[修改]:" + file.getAbsolutePath());
    }

    @Override
    public void onFileDelete(File file) {
        System.out.println("[删除]:" + file.getAbsolutePath());
    }


    @Override
    public void onDirectoryCreate(File directory) {
        System.out.println("[目录创建]:" + directory.getAbsolutePath());
        super.onDirectoryCreate(directory);
    }

    @Override
    public void onStart(FileAlterationObserver observer) {
        System.out.println("[开始监听]");
        super.onStart(observer);
    }

    @Override
    public void onStop(FileAlterationObserver observer) {
        System.out.println("[停止监听]");
        super.onStop(observer);
    }

    @Override
    public void onDirectoryDelete(File directory) {
        System.out.println("[目录删除]:" + directory.getAbsolutePath());
        super.onDirectoryDelete(directory);
    }

    @Override
    public void onDirectoryChange(File directory) {
        System.out.println("[目录修改]:" + directory.getAbsolutePath());
        super.onDirectoryChange(directory);
    }

    // 复制文件
    public static void copyFile(File sourceFile, File targetFile)
            throws IOException {
        BufferedInputStream inBuff = null;
        BufferedOutputStream outBuff = null;
        try {

            inBuff = new BufferedInputStream(new FileInputStream(sourceFile));

            outBuff = new BufferedOutputStream(new FileOutputStream(targetFile));

            byte[] b = new byte[1024 * 5];
            int len;
            while ((len = inBuff.read(b)) != -1) {
                outBuff.write(b, 0, len);
            }

            outBuff.flush();
        } finally {

            if (inBuff != null)
                inBuff.close();
            if (outBuff != null)
                outBuff.close();
        }
    }

}  

参考:
https://blog.csdn.net/yjc_1111/article/details/78819938

世界上所有的不公平都是由于当事人能力不足造成的.
原文地址:https://www.cnblogs.com/javayida/p/13347024.html