J'ai besoin d'obtenir une liste de tous les fichiers dans un répertoire, y compris les fichiers dans tous les sous-répertoires. Quelle est la méthode standard pour effectuer une itération de répertoire avec Java?
175
Vous pouvez utiliser File#isDirectory()
pour tester si le fichier (chemin) donné est un répertoire. Si tel est le cas true
, il vous suffit d'appeler à nouveau la même méthode avec son File#listFiles()
résultat. C'est ce qu'on appelle la récursivité .
Voici un exemple de lancement de base.
public static void main(String... args) {
File[] files = new File("C:/").listFiles();
showFiles(files);
}
public static void showFiles(File[] files) {
for (File file : files) {
if (file.isDirectory()) {
System.out.println("Directory: " + file.getName());
showFiles(file.listFiles()); // Calls same method again.
} else {
System.out.println("File: " + file.getName());
}
}
}
Notez que cela est sensible au StackOverflowError
moment où l'arborescence est plus profonde que ce que la pile de la JVM peut contenir. Vous voudrez peut-être utiliser une approche itérative ou une récursion de queue à la place, mais c'est un autre sujet;)
NullPointerException
produire lorsque le système de fichiers change entre l'appel àisDirectory
etlistFiles
comme cela peut arriver si vousSystem.out.println
bloquez ou si vous êtes vraiment malchanceux. Vérifier que la sortie delistFiles
n'est pas nulle résoudrait cette condition de concurrence.java.nio.file.DirectoryStream
vous permet d'itérer sur un répertoire et pourrait être implémenté pour avoir une petite empreinte mémoire, mais le seul moyen de le savoir avec certitude serait pour surveiller l'utilisation de la mémoire sur une plate-forme particulière.Si vous utilisez Java 1.7, vous pouvez utiliser
java.nio.file.Files.walkFileTree(...)
.Par exemple:
Si vous utilisez Java 8, vous pouvez utiliser l'interface de flux avec
java.nio.file.Files.walk(...)
:la source
Découvrez la classe FileUtils dans Apache Commons - en particulier iterateFiles :
la source
Pour Java 7+, il existe également https://docs.oracle.com/javase/7/docs/api/java/nio/file/DirectoryStream.html
Exemple tiré du Javadoc:
la source
En utilisant
org.apache.commons.io.FileUtils
Utilisez false si vous ne voulez pas de fichiers provenant de sous-répertoires.
la source
C'est un arbre, donc la récursivité est votre ami: commencez par le répertoire parent et appelez la méthode pour obtenir un tableau de fichiers enfants. Parcourez le tableau enfant. Si la valeur actuelle est un répertoire, passez-le à un appel récursif de votre méthode. Sinon, traitez le fichier feuille de manière appropriée.
la source
Comme indiqué, il s'agit d'un problème de récursivité. En particulier, vous voudrez peut-être regarder
Dans l'API de fichier java ici . Il renvoie un tableau de tous les fichiers d'un répertoire. Utiliser ceci avec
voir si vous avez besoin de récidiver davantage est un bon début.
la source
Pour ajouter avec la réponse @msandiford, comme la plupart du temps quand une arborescence de fichiers est parcourue, vous voudrez peut-être exécuter une fonction en tant que répertoire ou tout fichier particulier est visité. Si vous êtes réticent à utiliser les flux. Les méthodes suivantes remplacées peuvent être implémentées
la source
Vous pouvez également abuser de File.list (FilenameFilter) (et de ses variantes) pour la traversée de fichiers. Code court et fonctionne dans les premières versions de Java, par exemple:
la source