1. 概述
Apache Commons 项目旨在为开发者提供一套通用工具库,解决日常开发中的常见问题。本文将重点介绍 Commons IO 模块中的核心工具类及其高频使用场景,帮助你在文件操作中少踩坑。
2. Maven 依赖
在项目中使用 Commons IO,只需在 pom.xml
添加以下依赖:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.15.1</version>
</dependency>
最新版本可在 Maven Central 查询。
3. 核心工具类
这些工具类通过静态方法提供文件操作的通用解决方案,简单粗暴但高效。
3.1 FileUtils
专注文件操作:打开、读取、复制、移动等。看个实际例子:
File file = FileUtils.getFile(getClass().getClassLoader()
.getResource("fileTest.txt")
.getPath());
File tempDir = FileUtils.getTempDirectory();
FileUtils.copyFileToDirectory(file, tempDir);
File newTempFile = FileUtils.getFile(tempDir, file.getName());
String data = FileUtils.readFileToString(newTempFile,
Charset.defaultCharset());
✅ 一行代码搞定文件复制和读取,比原生 API 简洁太多。
3.2 FilenameUtils
提供跨平台的文件名操作,避免系统差异踩坑:
String fullPath = FilenameUtils.getFullPath(path);
String extension = FilenameUtils.getExtension(path);
String baseName = FilenameUtils.getBaseName(path);
⚠️ 处理文件路径时,用这个类比手动拼接字符串安全得多。
3.3 FileSystemUtils
快速检查磁盘剩余空间:
long freeSpace = FileSystemUtils.freeSpaceKb("/");
4. 输入输出流处理
提供多种流处理实现,这里重点讲 TeeInputStream
和 TeeOutputStream
。"Tee"(源自字母 T)指将单个输入分流到两个输出:
String str = "Hello World.";
ByteArrayInputStream inputStream = new ByteArrayInputStream(str.getBytes());
ByteArrayOutputStream outputStream1 = new ByteArrayOutputStream();
ByteArrayOutputStream outputStream2 = new ByteArrayOutputStream();
FilterOutputStream teeOutputStream
= new TeeOutputStream(outputStream1, outputStream2);
new TeeInputStream(inputStream, teeOutputStream, true)
.read(new byte[str.length()]);
assertEquals(str, String.valueOf(outputStream1));
assertEquals(str, String.valueOf(outputStream2));
✅ 同时写入两个输出流,日志记录等场景特别实用。
5. 文件过滤器
内置多种文件过滤器,帮你精准筛选目标文件。支持 AND/OR 逻辑组合,灵活度拉满。
示例:用 WildcardFileFilter
和 SuffixFileFilter
组合查找名称含 "ple" 且后缀为 "txt" 的文件:
@Test
public void whenGetFilewith_ANDFileFilter_thenFind_sample_txt()
throws IOException {
String path = getClass().getClassLoader()
.getResource("fileTest.txt")
.getPath();
File dir = FileUtils.getFile(FilenameUtils.getFullPath(path));
assertEquals("sample.txt",
dir.list(new AndFileFilter(
new WildcardFileFilter("*ple*", IOCase.INSENSITIVE),
new SuffixFileFilter("txt")))[0]);
}
6. 文件比较器
提供多种文件比较方式,这里介绍两个常用实现。
6.1 PathFileComparator
按路径排序文件,支持大小写敏感/不敏感/系统默认模式:
@Test
public void whenSortDirWithPathFileComparator_thenFirstFile_aaatxt()
throws IOException {
PathFileComparator pathFileComparator = new PathFileComparator(
IOCase.INSENSITIVE);
String path = FilenameUtils.getFullPath(getClass()
.getClassLoader()
.getResource("fileTest.txt")
.getPath());
File dir = new File(path);
File[] files = dir.listFiles();
pathFileComparator.sort(files);
assertEquals("aaa.txt", files[0].getName());
}
✅ 内置多种静态实例:PATH_COMPARATOR
、PATH_INSENSITIVE_COMPARATOR
等,按需取用。
6.2 SizeFileComparator
按文件大小比较,返回值规则:
- 负数:第一个文件较小
- 零:大小相等
- 正数:第一个文件较大
@Test
public void whenSizeFileComparator_thenLargerFile_large()
throws IOException {
SizeFileComparator sizeFileComparator = new SizeFileComparator();
File largerFile = FileUtils.getFile(getClass().getClassLoader()
.getResource("fileTest.txt")
.getPath());
File smallerFile = FileUtils.getFile(getClass().getClassLoader()
.getResource("sample.txt")
.getPath());
int i = sizeFileComparator.compare(largerFile, smallerFile);
Assert.assertTrue(i > 0);
}
7. 文件监控
通过 FileAlterationMonitor
实时监控文件/目录变化,需配合 FileAlterationObserver
和 FileAlterationListener
使用:
FileAlterationObserver observer = new FileAlterationObserver(folder);
FileAlterationMonitor monitor = new FileAlterationMonitor(5000);
FileAlterationListener fal = new FileAlterationListenerAdaptor() {
@Override
public void onFileCreate(File file) {
// 文件创建时的处理逻辑
}
@Override
public void onFileDelete(File file) {
// 文件删除时的处理逻辑
}
};
observer.addListener(fal);
monitor.addObserver(observer);
monitor.start();
⚠️ 记得在应用关闭时调用 monitor.stop()
,避免资源泄漏。
8. 总结
本文覆盖了 Commons IO 的核心组件,但该库还有更多实用功能(如行迭代器、文件监控等)。建议查阅 官方 API 文档 深入探索。
完整示例代码见 GitHub 项目。