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

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

时间: 2024-11-08 19:03:38

Apache下的FileUtils.listFiles方法简单使用技巧的相关文章

asp.net 站点在Apache下的配置,就这么简单

asp.net 站点在Apache下的配置,就这么简单 # # Virtual Hosts # # If you want to maintain multiple domains/hostnames on your # machine you can setup VirtualHost containers for them. Most configurations # use only name-based virtual hosts so the server doesn't need t

apache下实现301永久性重定向的方法

因为博客是使用了www.php100.com作为博客域名,所以想实现php100.com全部重定向(跳转)到www.php100.com.同时按照google的建议,使用服务器端 301 重定向,为了确保用户及搜索引擎定向至正确网页的最佳方法.301 状态代码表示某网页已被永久迁移至新位置.下面将了解一下apache下实现301永久性重定向2个方法,需要具有访问服务器的 .htaccess 文件的权限. 1. Apache模块 mod_alias的 Redirect 和 RedirectMatc

10.10-全栈Java笔记:Apache IOUtils和FileUtils的使用

JDK中提供的文件操作相关的类,功能非常基础,进行复杂操作时需要做大量编程工作.实际开发中,往往需要你自己动手编写相关的,尤其在遍历目录文件时,经常用到递归,非常繁琐. Apache-commons工具包中提供了FileUtils,可以让我们非常方便的对文件和目录进行操作. 本文就是让大家对FileUtils类有一个全面的认识,便于大家以后开发文件和目录相关功能. Apache IOUtils和FileUtils类库为我们提供了更加简单.功能更加强大的文件操作和IO流操作功能.非常值得大家学习和

PHP环境下Memcache的使用方法

原文:PHP环境下Memcache的使用方法 原文地址:http://www.2cto.com/kf/201503/384967.html 如今互联网崛起的时代,各大网站都面临着一个大数据流问题,怎么提高网站访问速度,减少对数据库的操作:作为PHP开发人员,我们一般能想到的方法有页面静态化处理.防盗链.CDN内容分发加速访问.mysql数据库优化建立索引.架设apache服务器集群().还有就是现在流行的各种分布式缓存技术:如memcached/redis: 1.什么是Memcached? a.

使用基于Apache Spark的随机森林方法预测贷款风险

使用基于Apache Spark的随机森林方法预测贷款风险 原文:Predicting Loan Credit Risk using Apache Spark Machine Learning Random Forests 作者:Carol McDonald,MapR解决方案架构师 翻译:KK4SBB 责编:周建丁([email protected].NET) 在本文中,我将向大家介绍如何使用Apache Spark的Spark.ml库中的随机森林算法来对银行信用贷款的风险做分类预测.Spark

Apache ab测试工具使用方法(无参、get传参、post传参)(转)

转自Apache ab测试工具使用方法(无参.get传参.post传参) Ab测试工具是apache自带的测试工具,具有简单易上手的特性,下面我总结一下我的使用方法,首先去官方下载apache程序包,我下的最新版本apache2.4.23,下载地址http://httpd.apache.org/download.cgi 我下载的windows版本,解压后放到某一目录即可. 1.呼出控制台 可以使用系统自带cmd或者Xshell工具均可 2.进入apache下的bin目录ab.exe就在此处 3.

Apache禁止目录访问的方法

在学习ThinkPHP(3.2.3)的时候,公共文件夹.应用目录文件夹等都自带或者自动生成index.html的安全文件.但是ThinkPHP文件夹(核心包)却没有这样的设置.那么ThinkPHP核心包文件夹目录岂不是可以通过网址直接访问到了吗? 百度过后也没有找到一个明确的说法.自己分析,可能的原因是这个文件夹的内容不怕别人看.不过这个理由总感觉怪怪的,并没有那么强的说服力.所以还是想想其他办法,看看能否曲线救国. 最简单的办法就是在服务器设置上禁止目录访问. 我用的是wamp2.2版本. 打

Apache ab测试工具使用方法(无参、get传参、post传参)

Ab测试工具是apache自带的测试工具,具有简单易上手的特性,下面我总结一下我的使用方法,首先去官方下载apache程序包,我下的最新版本apache2.4.23,下载地址http://httpd.apache.org/download.cgi 我下载的windows版本,解压后放到某一目录即可. 1.呼出控制台 可以使用系统自带cmd或者Xshell工具均可 2.进入apache下的bin目录ab.exe就在此处 3.使用方法 直接在此目录下输入ab回车就会罗列出使用帮助 使用方式:ab [

Apache下的配置文件httpd.conf、httpd-vhosts.conf 转

Apache下的配置文件httpd.conf.httpd-vhosts.conf(windows) 2013-05-24 22:09 by youxin, 58 阅读, 0 评论, 收藏, 编辑 httpd.conf文件一般存在于apache目录下的conf文件夹中,主要用来配置apache的.http.conf里面的配置介绍: 1.Listen :监听端口,默认情况是80. 2.ServerAdmin :服务器管理员邮箱. 3.ServerName:服务名. 4.DocumentRoot:PH