1. 简介

在本篇文章中,我们将深入探讨如何使用 Java 在指定目录中查找最后修改的文件。

首先,我们会介绍基于传统 java.io 和现代 java.nio 的实现方式。随后,我们还会展示如何借助 Apache Commons IO 库来完成相同的功能。

2. 使用 java.io API 实现

传统的 java.io 包提供了 File 类,用于封装文件和目录路径的抽象表示。

幸运的是,File 类提供了一个非常实用的方法:lastModified()该方法返回由抽象路径名表示的文件最后一次被修改的时间戳

下面是我们如何使用 java.io.File 类来实现目标功能:

public static File findUsingIOApi(String sdir) {
    File dir = new File(sdir);
    if (dir.isDirectory()) {
        Optional<File> opFile = Arrays.stream(dir.listFiles(File::isFile))
          .max((f1, f2) -> Long.compare(f1.lastModified(), f2.lastModified()));

        if (opFile.isPresent()){
            return opFile.get();
        }
    }

    return null;
}

可以看到,这里我们借助 Java 8 Stream API 遍历文件数组,并通过 max() 方法获取最近一次修改的文件。

⚠️ 注意:此处使用了 Optional 来包装结果,防止空指针异常。

✅ 虽然这种方式比较老旧,但在兼容旧系统时仍然有其价值。

3. 使用 java.nio API 实现

NIO(New I/O)的引入是 Java 文件系统管理的一个重要转折点。尤其是 Java 7 引入的 NIO.2 提供了更加强大和灵活的文件操作能力。

java.nio.file.Files 类在这方面表现尤为出色,提供了丰富的文件处理方法。

下面是使用 NIO 实现查找最新修改文件的方式:

public static Path findUsingNIOApi(String sdir) throws IOException {
    Path dir = Paths.get(sdir);
    if (Files.isDirectory(dir)) {
        Optional<Path> opPath = Files.list(dir)
          .filter(p -> !Files.isDirectory(p))
          .sorted((p1, p2)-> Long.valueOf(p2.toFile().lastModified())
            .compareTo(p1.toFile().lastModified()))
          .findFirst();

        if (opPath.isPresent()){
            return opPath.get();
        }
    }

    return null;
}

与前一个例子类似,我们使用 Stream API 过滤出所有文件,然后通过 lambda 表达式按照最后修改时间排序,最终获取最新的那个。

✅ NIO 更加现代化,性能更好,推荐优先使用。

4. 使用 Apache Commons IO 实现

Apache Commons IO 是一个非常流行的 I/O 工具库,它极大地简化了文件系统的操作。它提供了许多实用类、比较器和过滤器等工具。

其中,LastModifiedFileComparator 类可以作为比较器,用来根据最后修改时间对文件数组进行排序

首先,我们需要在 pom.xml 中添加依赖:

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.15.1</version>
</dependency>

接下来展示如何使用 Apache Commons IO 查找最新修改的文件:

public static File findUsingCommonsIO(String sdir) {
    File dir = new File(sdir);
    if (dir.isDirectory()) {
        File[] dirFiles = dir.listFiles((FileFilter)FileFilterUtils.fileFileFilter());
        if (dirFiles != null && dirFiles.length > 0) {
            Arrays.sort(dirFiles, LastModifiedFileComparator.LASTMODIFIED_REVERSE);
            return dirFiles[0];
        }
     }

    return null;
}

如上所示,我们使用 LASTMODIFIED_REVERSE 单例实例将文件数组按修改时间倒序排列。

由于是倒序排序,所以最新修改的文件就是数组的第一个元素。

✅ 如果项目中已经引入了 Commons IO,这种写法简单粗暴还很直观。

5. 总结

本文介绍了三种在 Java 中查找某个目录下最新修改文件的方法:

  • 使用传统的 java.io.File
  • 使用现代的 java.nio.file.Files
  • 利用 Apache Commons IO 的 LastModifiedFileComparator

每种方式都有自己的适用场景:

方式 特点
java.io 兼容性好,但功能较弱
java.nio 功能强大,推荐首选
Apache Commons IO 简洁易用,适合已有依赖场景

完整代码示例可以在 GitHub 上找到。


原始标题:Find the Last Modified File in a Directory with Java | Baeldung