zoukankan      html  css  js  c++  java
  • Apache下的FileUtils.listFiles方法简单使用技巧

    一、引言

    Apache提供的很多工具方法非常好用,推荐。

    今天在使用的过程中使用到了org.apache.commons.io.FileUtils.listFiles方法,本文主要谈谈这个工具方法的用法。

    查看源码上的说明是

        /**
         * Finds files within a given directory (and optionally its
         * subdirectories). All files found are filtered by an IOFileFilter.
         * <p>
         * If your search should recurse into subdirectories you can pass in
         * an IOFileFilter for directories. You don't need to bind a
         * DirectoryFileFilter (via logical AND) to this filter. This method does
         * that for you.
         * <p>
         * An example: If you want to search through all directories called
         * "temp" you pass in <code>FileFilterUtils.NameFileFilter("temp")</code>
         * <p>
         * Another common usage of this method is find files in a directory
         * tree but ignoring the directories generated CVS. You can simply pass
         * in <code>FileFilterUtils.makeCVSAware(null)</code>.
         *
         * @param directory  the directory to search in
         * @param fileFilter filter to apply when finding files.
         * @param dirFilter  optional filter to apply when finding subdirectories.
         *                   If this parameter is {@code null}, subdirectories will not be included in the
         *                   search. Use TrueFileFilter.INSTANCE to match all directories.
         * @return an collection of java.io.File with the matching files
         * @see org.apache.commons.io.filefilter.FileFilterUtils
         * @see org.apache.commons.io.filefilter.NameFileFilter
         */

    大意就是:

    在指定的目录中(可以指定到子目录)通过IOFileFilter过滤器查找文件。
    比如:
    如果你要在所有的名为"temp"的目录,你可以使用:FileFilterUtils.NameFileFilter("temp")

     二、基本使用

    测试目录下的目录结构如下所示: 

    M:FileTest
    │      5.txt
    ├─001
    │ │    1.txt
    │ │    2.txt
    │ │ 
    │ └─011
    │      bc.eddx
    │      d.docx
    │ 
    └─002
           3.txt
           4.txt

    最开始仅仅想获取目录下的文件,如下方法:

            Collection<File> listFiles = FileUtils.listFiles(new File("M:/FileTest"), null, null);
            for (File file : listFiles) {
                System.out.println(file.getName());
            }

    此处会抛出错误:

    其源码如下:Parameter 'fileFilter' is null"

        private static void validateListFilesParameters(final File directory, final IOFileFilter fileFilter) {
            if (!directory.isDirectory()) {
                throw new IllegalArgumentException("Parameter 'directory' is not a directory: " + directory);
            }
            if (fileFilter == null) {
                throw new NullPointerException("Parameter 'fileFilter' is null");
            }
        }

    可以看出,第二个针对文件的过滤器不可以为空。

    换成第二种做法:利用FileFilterUtils进行文件过滤器的创建。下面代码中使用到了 FileFilterUtils.suffixFileFilter("txt") 表示过滤出文件名后缀为txt的文件,第三个参数表示通常表示是否递归查询目录,null表示递归。

        @Test
        public void test2(){
            Collection<File> listFiles = FileUtils.listFiles(new File("M:/FileTest"), FileFilterUtils.suffixFileFilter("txt"), null);
            showFiles(listFiles);
        }
    
        private void showFiles(Collection<File> listFiles) {
            if (listFiles==null) {
                return;
            }
            for (File file : listFiles) {
                System.out.println(file.getName());
            }
        }

    上述方法结果是:

    5.txt

    稍微修改下最后一个参数,将其由null转变为DirectoryFileFilter.INSTANCE,方法将使用递归的形式来进行文件过滤扫描。

        @Test
        public void test3(){
            Collection<File> listFiles = FileUtils.listFiles(new File("M:/FileTest"), FileFilterUtils.suffixFileFilter("txt"), DirectoryFileFilter.INSTANCE);
            showFiles(listFiles);
        }

    结果为:

    1.txt
    2.txt
    3.txt
    4.txt
    5.txt

    这里需要注意,如果仅仅是过滤后缀,Apache提供了更加简单的方法:

        @Test
        public void test4(){
            Collection<File> listFiles = FileUtils.listFiles(new File("M:/FileTest"), new String[]{"txt"}, true);
            showFiles(listFiles);
        }

    方法说明参见上图,此处时间关系不在赘述。

    三、常见文件过滤器

     从其中最灵活的方法签名中可以得到一些信息:

    第二个参数是IOFilFilter fileFilter,通过查看源码的形式可以知道其为一个接口

    很显然我们查看这个接口有哪些实现类就可以获得由那些FileFilter。

    从上述图的记过可以看出有基于文件大小的SizeFileFilter,基于文件名称前缀的PrefixFileFilter...,具体使用情况,依照自己项目情况选择,我这里就不一一举例了(0.0 其实我也没有全部用过~~~)

        @Test
        public void test5(){
            Collection<File> listFiles = FileUtils.listFiles(new File("M:/FileTest"), FileFilterUtils.and(EmptyFileFilter.NOT_EMPTY,new RegexFileFilter("^[0-9]+.[a-zA-z]+$")), DirectoryFileFilter.INSTANCE);
            showFiles(listFiles);
        }

    因为我的目录中只有5.txt有点内容,所以最终的结果是5.txt,上面代码中注意

    FileFilterUtils.and(EmptyFileFilter.NOT_EMPTY,new RegexFileFilter("^[0-9]+.[a-zA-z]+$"))

    其中表示有2个文件过滤器,其中一个是不为空的文件过滤器,另外一个是查找文件名称的过滤器,其匹配规则是:"^[0-9]+.[a-zA-z]+$" 即文件名称只能是一个或者多个数字构成,后缀由一个或多个字母构成。

    ~~Over

    本次博文算是我最用心的一次了。。。。

  • 相关阅读:
    base64编码是什么1
    base64编码是什么
    算法
    spring 的 ApplicationContext.getBean(type) 无法获取bean,报错
    多个tomcat shutdown.sh 导致无法正常关闭的问题
    springboot server.address 配置问题
    jsp页面错误的全局处理
    ASP.NET MVC三层关系
    ASP.NET指定页面转PDF、JPG(插件)
    Java理论知识及面试题
  • 原文地址:https://www.cnblogs.com/LiuChunfu/p/5651956.html
Copyright © 2011-2022 走看看