如何使用Java在目錄中查找最後修改的文件?
- 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。