Suchen Sie die zuletzt geänderte Datei in einem Verzeichnis mit Java

1. Übersicht

In diesem kurzen Tutorial werden wir uns genauer ansehen, wie Sie die zuletzt geänderte Datei in einem bestimmten Verzeichnis in Java finden.

Zunächst beginnen wir mit dem Legacy-E / A und den modernen NIO-APIs. Dann werden wir sehen, wie Sie die Apache Commons IO-Bibliothek verwenden, um dasselbe zu erreichen.

2. Verwenden der java.io- API

Das ältere Paket java.io bietet die File- Klasse, um eine abstrakte Darstellung von Datei- und Verzeichnispfadnamen zu kapseln.

Zum Glück enthält die File- Klasse eine praktische Methode namens lastModified (). Diese Methode gibt die zuletzt geänderte Zeit der Datei zurück, die durch einen abstrakten Pfadnamen gekennzeichnet ist .

Schauen wir uns nun an, wie wir die Klasse java.io.File verwenden können , um den beabsichtigten Zweck zu erreichen:

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

Wie wir sehen können, verwenden wir die Java 8 Stream-API, um ein Array von Dateien zu durchlaufen. Anschließend rufen wir die Operation max () auf, um die Datei mit den neuesten Änderungen abzurufen .

Beachten Sie, dass wir eine optionale Instanz verwenden, um die zuletzt geänderte Datei zu kapseln.

Denken Sie daran, dass dieser Ansatz als altmodisch und veraltet gilt. Wir können es jedoch verwenden, wenn wir mit der Java Legacy IO-Welt kompatibel bleiben möchten .

3. Verwenden der java.nio- API

Die Einführung der NIO-API ist ein Wendepunkt für die Dateisystemverwaltung. Die neue Version NIO.2, die in Java 7 ausgeliefert wird, bietet eine Reihe erweiterter Funktionen für eine bessere Dateiverwaltung und -bearbeitung.

Tatsächlich bietet die Klasse java.nio.file.Files eine große Flexibilität bei der Bearbeitung von Dateien und Verzeichnissen in Java.

Schauen wir uns also an, wie wir die Files- Klasse verwenden können, um die zuletzt geänderte Datei in einem Verzeichnis abzurufen:

public static Path findUsingNIOApi(String sdir) throws IOException { Path dir = Paths.get(sdir); if (Files.isDirectory(dir)) { Optional 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; }

Ähnlich wie im ersten Beispiel verlassen wir uns auf die Steam-API, um nur Dateien abzurufen. Anschließend sortieren wir unsere Dateien anhand der zuletzt geänderten Zeit mithilfe eines Lambda-Ausdrucks .

4. Verwenden von Apache Commons IO

Das Apache Commons IO hat die Dateisystemverwaltung auf die nächste Stufe gebracht. Es bietet eine Reihe praktischer Klassen, Dateikomparatoren, Dateifilter und vieles mehr.

Zum Glück bietet die Bibliothek die LastModifiedFileComparator- Klasse an, die als Komparator verwendet werden kann, um ein Array von Dateien nach ihrer letzten Änderungszeit zu sortieren .

Zunächst müssen wir die Commons-Io- Abhängigkeit in unsere pom.xml einfügen :

 commons-io commons-io 2.7 

Lassen Sie uns zum Schluss zeigen, wie Sie mit Apache Commons IO die zuletzt geänderte Datei in einem Ordner finden:

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; }

Wie oben gezeigt, verwenden wir die Singleton-Instanz LASTMODIFIED_REVERSE , um unser Dateiarray in umgekehrter Reihenfolge zu sortieren .

Da das Array umgekehrt sortiert ist, ist die zuletzt geänderte Datei das erste Element des Arrays.

5. Schlussfolgerung

In diesem Tutorial haben wir verschiedene Möglichkeiten untersucht, um die zuletzt geänderte Datei in einem bestimmten Verzeichnis zu finden. Unterwegs verwendeten wir APIs, die Teil des JDK und der externen Apache Commons IO-Bibliothek sind.

Wie immer ist die vollständige Codequelle der Beispiele auf GitHub verfügbar.