zoukankan      html  css  js  c++  java
  • 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

    世界上所有的不公平都是由于当事人能力不足造成的.
  • 相关阅读:
    Android.mk添加第三方jar包
    关于回调函数
    Ubuntu下GIT服务器的安装与配置
    三星I9100在Ubuntu下用Adb调试
    Android检测网络是否可用和主机是否可达
    keepalived配置文件解析系列之(一)keepalived简介及配置文件介绍
    keepalived配置文件解析系列之(三)配置文件解析过程
    C语言中的位域(bitfield)概念
    popen和变长参数库函数(va_xxx)用法举例及命令执行失败情况探讨
    《深入理解Linux内核》条目式笔记 _3
  • 原文地址:https://www.cnblogs.com/javayida/p/13347024.html
Copyright © 2011-2022 走看看