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 上找到。