Trova l'ultimo file modificato in una directory con Java

1. Panoramica

In questo breve tutorial, daremo un'occhiata da vicino a come trovare l'ultimo file modificato in una directory specifica in Java.

Innanzitutto, inizieremo con l'IO legacy e le moderne API NIO. Quindi, vedremo come utilizzare la libreria Apache Commons IO per ottenere la stessa cosa.

2. Utilizzo dell'API java.io

Il pacchetto java.io legacy fornisce la classe File per incapsulare una rappresentazione astratta dei nomi dei percorsi di file e directory.

Per fortuna, la classe File viene fornita con un pratico metodo chiamato lastModified (). Questo metodo restituisce l'ora dell'ultima modifica del file indicata da un percorso astratto .

Vediamo ora come possiamo usare la classe java.io.File per raggiungere lo scopo previsto:

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

Come possiamo vedere, utilizziamo l'API Java 8 Stream per eseguire il ciclo attraverso una serie di file. Quindi, invochiamo l' operazione max () per ottenere il file con le modifiche più recenti .

Si noti che utilizziamo un'istanza facoltativa per incapsulare l'ultimo file modificato.

Tieni presente che questo approccio è considerato antiquato e obsoleto. Tuttavia, possiamo usarlo se vogliamo rimanere compatibili con il mondo IO legacy di Java .

3. Utilizzando il java.nio API

L'introduzione dell'API NIO è un punto di svolta per la gestione del file system. La nuova versione NIO.2 fornita in Java 7 include una serie di funzionalità avanzate per una migliore gestione e manipolazione dei file.

È un dato di fatto, la classe java.nio.file.Files offre una grande flessibilità quando si tratta di manipolare file e directory in Java.

Quindi, vediamo come possiamo utilizzare la classe Files per ottenere l'ultimo file modificato in una directory:

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

Analogamente al primo esempio, ci affidiamo all'API di Steam per ottenere solo i file. Quindi, ordiniamo i nostri file in base all'ora dell'ultima modifica con l'aiuto di un'espressione lambda .

4. Utilizzo di Apache Commons IO

Apache Commons IO ha portato la gestione del file system a un livello superiore. Fornisce una serie di classi utili, comparatori di file, filtri di file e molto altro.

Fortunatamente per noi, la libreria offre la classe LastModifiedFileComparator che può essere utilizzata come comparatore per ordinare un array di file in base all'ora dell'ultima modifica .

Per prima cosa, dobbiamo aggiungere la dipendenza commons-io nel nostro pom.xml :

 commons-io commons-io 2.7 

Infine, mostriamo come trovare l'ultimo file modificato in una cartella utilizzando 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; }

Come mostrato sopra, usiamo l' istanza singleton LASTMODIFIED_REVERSE per ordinare il nostro array di file in ordine inverso .

Poiché l'array è ordinato in modo inverso, l'ultimo file modificato è il primo elemento dell'array.

5. conclusione

In questo tutorial, abbiamo esplorato diversi modi per trovare l'ultimo file modificato in una particolare directory. Lungo il percorso, abbiamo utilizzato API che fanno parte del JDK e della libreria esterna Apache Commons IO.

Come sempre, il codice sorgente completo degli esempi è disponibile su GitHub.