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. 输入输出流处理

提供多种流处理实现,这里重点讲 TeeInputStreamTeeOutputStream。"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 逻辑组合,灵活度拉满。

示例:用 WildcardFileFilterSuffixFileFilter 组合查找名称含 "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_COMPARATORPATH_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 实时监控文件/目录变化,需配合 FileAlterationObserverFileAlterationListener 使用:

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 项目


原始标题:Apache Commons IO