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
本次博文算是我最用心的一次了。。。。
Original url: Access
Created at: 2019-03-15 15:59:01
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论