Liste des fichiers dans un répertoire en Java

1. Vue d'ensemble

Dans ce rapide didacticiel, nous examinerons différentes façons de répertorier les fichiers dans un répertoire .

2. Liste

Si nous voulons lister tous les fichiers dans le répertoire et sauter plus loin dans les sous-répertoires, nous pouvons simplement utiliser java.io.File # listFiles :

public Set listFilesUsingJavaIO(String dir) { return Stream.of(new File(dir).listFiles()) .filter(file -> !file.isDirectory()) .map(File::getName) .collect(Collectors.toSet()); }

3. DirectoryStream

Cependant, Java 7 a introduit une alternative plus rapide à File # listFiles appelée DirectoryStream .

Voyons à quoi ressemble l'équivalent:

public Set listFilesUsingDirectoryStream(String dir) throws IOException { Set fileList = new HashSet(); try (DirectoryStream stream = Files.newDirectoryStream(Paths.get(dir))) { for (Path path : stream) { if (!Files.isDirectory(path)) { fileList.add(path.getFileName() .toString()); } } } return fileList; }

Nous pouvons facilement voir que même si DirectoryStream peut être plus rapide, il ne fait pas partie de l' API Stream et n'est pas aussi prêt à travailler avec elle.

En outre, DirectoryStream nécessite que nous fermions la ressource, ce qui signifie que nous l'enveloppons également avec un essai avec des ressources .

4. Marcher

Ou, nous pouvons lister tous les fichiers d'un répertoire en le parcourant jusqu'à une profondeur configurée .

Utilisons java.nio.file.Files # walk pour lister tous les fichiers d'un répertoire à une profondeur donnée:

public Set listFilesUsingFileWalk(String dir, int depth) throws IOException { try (Stream stream = Files.walk(Paths.get(dir), depth)) { return stream .filter(file -> !Files.isDirectory(file)) .map(Path::getFileName) .map(Path::toString) .collect(Collectors.toSet()); } }

Bien sûr, n'oubliez pas d'utiliser try-with-resources pour que le descripteur de fichier pour dir se ferme correctement.

Ou, si nous voulons avoir plus de contrôle sur ce qui se passe avec chaque fichier visité, nous pouvons également fournir une implémentation visiteur:

public Set listFilesUsingFileWalkAndVisitor(String dir) throws IOException { Set fileList = new HashSet(); Files.walkFileTree(Paths.get(dir), new SimpleFileVisitor() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { if (!Files.isDirectory(file)) { fileList.add(file.getFileName().toString()); } return FileVisitResult.CONTINUE; } }); return fileList; }

Ceci est pratique lorsque nous voulons effectuer une lecture supplémentaire, déplacer ou supprimer des fichiers au fur et à mesure.

5. Conclusion

Dans ce rapide didacticiel, nous avons exploré différentes façons de répertorier les fichiers dans un répertoire.

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