一、引言

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

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

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

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

    asp.net 网站在Apache下的配置,就这么简单 # # Virtual Hosts # # If you want to maintain multiple domains/hostnames ...

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

    asp.net 站点在Apache下的配置,就这么简单 # # Virtual Hosts # # If you want to maintain multiple domains/hostnames ...

  3. apache下ab.exe使用方法。。

    自己在cmd中写了半天的路径也没有写对..最后网上的一个哥们告诉我说没有共同语言了...毛线啊 差距确实很大!大能猫死panda早晚干掉你,叫你丫整天嘲讽我! 比如我的ab.exe在D盘的wamp文件 ...

  4. linux apache下虚拟主机配置方法

    假设VPS的IP是58.130.17.168,有两个域名指向该IP,分别是domain1.com, domain2.com, 修改/etc/httpd/conf/httpd.conf,在文件的最后加入 ...

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

    因为博客是使用了www.php100.com作为博客域名,所以想实现php100.com全部重定向(跳转)到www.php100.com.同时按照google的建议,使用服务器端 301 重定向,为了 ...

  6. Windows下phpStudy中的Apache无法启动的排查方法

    尝试一:检查端口占用问题 刚开始以为是端口占用,使用 phpStudy 自带的端口检测,查看并没有占用.在 cmd 控制台中输入:services.msc 去系统服务里面看,单独配置的 Apache ...

  7. apache.commons.io.FileUtils的常用操作

    至于相关jar包可以到官网获取 http://commons.apache.org/downloads/index.html package com.wz.apache.fileUtils; impo ...

  8. Java:Apache Commons 工具类介绍及简单使用

    Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下面是我这几年做开发过程中自己用过的工具类做简单介绍. Commons简介 组件 功能介绍 commo ...

  9. Apache下开启SSI配置使html支持include包含

    写页面的同学通常会遇到这样的烦恼,就是页面上的 html 标签越来越多的时候,寻找指定的部分就会很困难,那么能不能像 javascript 一样写在不同的文件中引入呢?答案是有的,apache 能做到 ...

随机推荐

  1. eclipse4.3 安装tomcat8

    Go to the WTP downloads page, select the 3.6.0 version , and download the zip (under Traditional Zip ...

  2. hdu_4529_郑厂长系列故事——N骑士问题(状压DP)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4529 题意:中文,不解释 题解:状压DP,dp[i][j][k][s]表示第i行当前用了j个骑士,i- ...

  3. unix文件系统

    转自here 我一向坚持的原则,那就是任何东西的根本性的,本质上的原理以及背后的思想都是及其简单的,所谓的复杂性都是优化与策略化的扩展带来的,正如TCP一样,UNIX的文件系统也不例外!我们必须知道, ...

  4. Away 3d 框架

    卷 工作资料 的文件夹 PATH 列表 卷序列号为 00000200 F8B8:EE5E E:. │  tree.txt │  tree1.txt │   ├─away3d │  │  .DS_Sto ...

  5. 一个字符串搜索的Aho-Corasick算法

    Aho和Corasick对KMP算法(Knuth–Morris–Pratt algorithm)进行了改进,Aho-Corasick算法(Aho-Corasick algorithm)利用构建树,总时 ...

  6. ILMerge 简单使用

    ILMerge是合并.net的assembly的工具,最新版的支持.net 4.0的ILmerge下载: http://www.microsoft.com/downloads/details.aspx ...

  7. Toolbar Painter 工具条制作

    工具条制作工具(ToolBarPainter2013.exe),专为程序猿设计,界面开发必备.当用VC编程制作工具条时,需要为工具栏上每一个button添加图标,是一件极其繁琐的事情,该工具可利用已有 ...

  8. ng-option小解

    ng-option 有数组,对象两种情况,但目前只接触过数组 数组: label for value in array 分为一般数组和对象数组 一般数组: <select ng-model=&q ...

  9. css的单位

    如果你是一名前端开发工程师,一般px和em使用频率比较高.但是今天的重点是介绍一些我们使用很少.甚至木有听说过的单位. 一.em <style type="text/css" ...

  10. BigDecimal加减乘除运算

    java.math.BigDecimal.BigDecimal一共有4个够造方法,让我先来看看其中的两种用法: 第一种:BigDecimal(double val)Translates a doubl ...