Rechercher le dernier fichier modifié dans un répertoire avec Java

1. Vue d'ensemble

Dans ce tutoriel rapide, nous allons examiner de près comment trouver le dernier fichier modifié dans un répertoire spécifique en Java.

Tout d'abord, nous allons commencer par l'ancien IO et les API NIO modernes. Ensuite, nous verrons comment utiliser la bibliothèque Apache Commons IO pour accomplir la même chose.

2. Utilisation de l' API java.io

Le package java.io hérité fournit la classe File pour encapsuler une représentation abstraite des chemins de fichiers et de répertoires.

Heureusement, la classe File est fournie avec une méthode pratique appelée lastModified (). Cette méthode renvoie la dernière heure de modification du fichier indiquée par un chemin abstrait .

Voyons maintenant comment nous pouvons utiliser la classe java.io.File pour atteindre l'objectif visé:

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

Comme nous pouvons le voir, nous utilisons l'API Java 8 Stream pour parcourir un tableau de fichiers. Ensuite, nous invoquons l' opération max () pour obtenir le fichier avec les modifications les plus récentes .

Notez que nous utilisons une instance facultative pour encapsuler le dernier fichier modifié.

Gardez à l'esprit que cette approche est considérée comme démodée et dépassée. Cependant, nous pouvons l'utiliser si nous voulons rester compatibles avec le monde IO hérité de Java .

3. Utilisation de l' API java.nio

L'introduction de l'API NIO est un tournant dans la gestion du système de fichiers. La nouvelle version NIO.2 livrée avec Java 7 comprend un ensemble de fonctionnalités améliorées pour une meilleure gestion et manipulation des fichiers.

En fait, la classe java.nio.file.Files offre une grande flexibilité lorsqu'il s'agit de manipuler des fichiers et des répertoires en Java.

Voyons donc comment nous pouvons utiliser la classe Files pour récupérer le dernier fichier modifié dans un répertoire:

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

Comme pour le premier exemple, nous nous appuyons sur l'API Steam pour obtenir uniquement des fichiers. Ensuite, nous trions nos fichiers en fonction de la dernière heure de modification à l'aide d'une expression lambda .

4. Utilisation d'Apache Commons IO

Apache Commons IO a fait passer la gestion du système de fichiers au niveau supérieur. Il fournit un ensemble de classes pratiques, de comparateurs de fichiers, de filtres de fichiers et bien plus encore.

Heureusement pour nous, la bibliothèque propose la classe LastModifiedFileComparator qui peut être utilisée comme comparateur pour trier un tableau de fichiers en fonction de leur date de dernière modification .

Tout d'abord, nous devons ajouter la dépendance commons-io dans notre pom.xml :

 commons-io commons-io 2.7 

Enfin, montrons comment trouver le dernier fichier modifié dans un dossier à l'aide d'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; }

Comme indiqué ci-dessus, nous utilisons l' instance de singleton LASTMODIFIED_REVERSE pour trier notre tableau de fichiers dans l'ordre inverse .

Puisque le tableau est trié de manière inversée, le dernier fichier modifié est le premier élément du tableau.

5. Conclusion

Dans ce didacticiel, nous avons exploré différentes manières de trouver le dernier fichier modifié dans un répertoire particulier. En cours de route, nous avons utilisé des API qui font partie du JDK et de la bibliothèque externe Apache Commons IO.

Comme toujours, le code source complet des exemples est disponible à l'adresse over sur GitHub.