Maison >Java >javaDidacticiel >Comment puis-je parcourir une arborescence de répertoires en Java ?
Itérer dans une arborescence de répertoires en Java
L'une des tâches courantes lorsque l'on travaille avec des répertoires est de parcourir tous les fichiers et répertoires qu'ils contiennent. un répertoire spécifié. Cela inclut les sous-répertoires, offrant un accès complet à l’intégralité de l’arborescence des répertoires. En Java, il existe des approches standard pour obtenir cette fonctionnalité.
File#isDirectory() :
La classe File en Java a une méthode appelée isDirectory() qui peut être utilisé pour déterminer si un fichier représente un répertoire ou un fichier. Si le fichier donné est un répertoire, alors il contient une liste de fichiers et de répertoires, qui peuvent être obtenus à l'aide de la méthode listFiles().
Approche récursive avec fichiers#listFiles() :
Une approche simple pour parcourir une arborescence de répertoires consiste à utiliser la récursivité. L'extrait suivant illustre cette méthode :
import java.io.File; public class DirectoryIterator { public static void main(String[] args) { File directory = new File("/path/to/dir"); showFiles(directory.listFiles()); } public static void showFiles(File[] files) { for (File file : files) { if (file.isDirectory()) { System.out.println("Directory: " + file.getAbsolutePath()); showFiles(file.listFiles()); // Recursive call } else { System.out.println("File: " + file.getAbsolutePath()); } } } }
Cette approche fonctionne en appelant récursivement showFiles() sur la liste de fichiers renvoyée par listFiles(). Cependant, il est important de gérer l'exception StackOverflowError, qui peut se produire si l'arborescence des répertoires est trop profonde pour que la pile de la JVM puisse la gérer.
Files#walk() pour Tail Recursion :
Pour Java 8 et versions ultérieures, une approche plus efficace consiste à utiliser Files#walk(). Cette méthode implémente la récursion de queue, qui évite le problème StackOverflowError en conservant l'état de l'itération dans la pile d'appels de méthode plutôt que dans la pile JVM.
import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class DirectoryIteratorWithJava8 { public static void main(String[] args) throws Exception { Path directory = Paths.get("/path/to/dir"); Files.walk(directory).forEach(path -> showFile(path.toFile())); } public static void showFile(File file) { if (file.isDirectory()) { System.out.println("Directory: " + file.getAbsolutePath()); } else { System.out.println("File: " + file.getAbsolutePath()); } } }
Files#walk() génère un flux d'objets Path représentant les fichiers et répertoires dans l’arborescence de répertoires donnée. La méthode forEach() est ensuite utilisée pour traiter chaque objet Path et afficher le fichier ou le répertoire correspondant.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!