如何使用Java在目錄中查找最後修改的文件?

1.概述

在本快速教程中,我們將仔細研究如何在Java的特定目錄中查找最後修改的文件。

首先,我們將從舊版IO和現代NIO API開始。然後,我們將看到如何使用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實例封裝了最後修改的文件。

請記住,這種方法被認為是過時的和過時的。但是,如果我們想與Java舊式IO世界保持兼容,就可以使用它

3.使用java.nio API

NIO API的引入是文件系統管理的轉折點。 Java 7中提供的新版本NIO.2帶有一組增強的功能,可以更好地管理和操縱文件。

實際上,在Java中操作文件和目錄時java.nio.file.Files

因此,讓我們看看如何利用Files類來獲取目錄中最後修改的文件:

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;

 }

與第一個示例類似,我們依靠Steam API僅獲取文件。然後,借助lambda表達式,根據上次修改時間對文件進行排序

4.使用Apache Commons IO

Apache Commons IO已將文件系統管理提高到了一個新水平。它提供了一組方便的類,文件比較器,文件過濾器等。

對我們來說幸運的是,該庫提供了**LastModifiedFileComparator類,該類可用作**比較器,以按文件的最後修改時間對文件數組進行排序

首先,我們需要在pom.xml commons-io依賴項

<dependency>

 <groupId>commons-io</groupId>

 <artifactId>commons-io</artifactId>

 <version>2.8.0</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以相反的順序對文件數組進行排序**。

由於數組是反向排序的,因此最後修改的文件是數組的第一個元素。

5.結論

在本教程中,我們探索了在特定目錄中查找最後修改的文件的不同方法。在此過程中,我們使用了JDK和Apache Commons IO外部庫中的API。