一、引言

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

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

查看源码上的说明是

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

大意就是:

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

二、基本使用

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

  1. M:\FileTest
  2. 5.txt
  3. ├─001
  4. 1.txt
  5. 2.txt

  6. └─011
  7. bc.eddx
  8. d.docx

  9. └─002
  10. 3.txt
  11. 4.txt

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

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

此处会抛出错误:

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

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

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

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

  1. @Test
  2. public void test2(){
  3. Collection<File> listFiles = FileUtils.listFiles(new File("M:/FileTest"), FileFilterUtils.suffixFileFilter("txt"), null);
  4. showFiles(listFiles);
  5. }
  6.  
  7. private void showFiles(Collection<File> listFiles) {
  8. if (listFiles==null) {
  9. return;
  10. }
  11. for (File file : listFiles) {
  12. System.out.println(file.getName());
  13. }
  14. }

上述方法结果是:

  1. 5.txt

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

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

结果为:

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

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

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

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

三、常见文件过滤器

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

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

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

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

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

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

  1. 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. hdu_2089_不要62(数位DP)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:中文,不解释 题解:dp[i][j]表示当前第i位的前一个数为j,然后记忆化dfs,注意的 ...

  2. Win7 Cygwin环境试验Nutch tutorial遇到的异常解决方法

    安装tutorial的步骤安装Nutch,当执行下面这条命令时出现异常 bin/nutch crawl urls - -topN Injector: starting at -- :: Injecto ...

  3. elasticsearch快照和恢复

    摘要:es可以通过简单的命令对索引或者整个集群进行快照和恢复 快照和恢复 Snapshot and restore 模块允许创建单个索引或者整个集群的快照到远程仓库. 在初始版本里只支持共享文件系统的 ...

  4. 第5章 字符串----char与String

    1.java有8种基本数据类型: 数值型:整数类型(byte,short,int,long) :浮点类型(float,double) 字符型:char  布尔型:true,false 2.char:  ...

  5. Linux网卡配置与绑定

    一定要在服务管理中关闭NetworkManager服务并禁用自动启动. 第一步:先查看下本机网卡,使用命令到network-scripts 下 [root@root~]# cd /etc/syscon ...

  6. 让您的Xcode键字如飞

    手指在键盘上飞速跳跃,终端上的代码也随着飞舞,是的这确实很酷.优秀的程序员总是这么一群人,他们不拘于现状,不固步自封,他们喜欢新奇的事,他们把自己发挥到极致. 指法攻略 放下您钟爱的鼠标吧,在前行之中 ...

  7. Java学习笔记之基于TCP协议的socket

    可以一直输入,而不是一问一答: 开两个线程,一个负责收,一个负责发. 1.先运行: package com.zr.javase0825; import java.io.BufferedReader; ...

  8. cmd实用指令

    具体可参考:http://www.jb51.net/os/windows/36986.html 以下是本人总结的一些比较实用的指令,仅仅只是自己的实战笔记 f: 进入F盘 同理 c: 进入C盘 cd ...

  9. C++中的基本数据类型

    C++中定义了一组表示整数.浮点数.单个字符和布尔值的算术类型(arithmetic type). 另外还定义了一种叫做void的特殊类型.void类型没有对应的值,仅用在有限的一些情况下,通常用作无 ...

  10. log4j打印出线程号和方法名

    先参考实现配置,如果想要更加详细的配置,可加上更多参数: log4j.rootLogger = INFO,FILE,CONSOLE log4j.appender.FILE.Threshold=INFO ...