Necesito obtener una lista de todos los archivos en un directorio, incluidos los archivos en todos los subdirectorios. ¿Cuál es la forma estándar de lograr la iteración de directorio con Java?
175
Puede usar File#isDirectory()
para probar si el archivo (ruta) dado es un directorio. Si es así true
, simplemente vuelve a llamar al mismo método con su File#listFiles()
resultado. Esto se llama recursividad .
Aquí hay un ejemplo básico de inicio.
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());
}
}
}
Tenga en cuenta que esto es sensible a StackOverflowError
cuando el árbol es más profundo de lo que puede contener la pila de la JVM. Es posible que desee utilizar un enfoque iterativo o recursión de cola en su lugar, pero ese es otro tema;)
NullPointerException
cuando el sistema de archivos cambia entre la llamadaisDirectory
y,listFiles
como podría suceder si seSystem.out.println
bloquean o simplemente tienes mala suerte. Verificar que la salida delistFiles
no sea nula resolvería esa condición de carrera.java.nio.file.DirectoryStream
permite iterar sobre un directorio, y podría implementarse para tener una pequeña huella de memoria, pero la única forma de saberlo con certeza sería para monitorear el uso de memoria en una plataforma en particular.Si está utilizando Java 1.7, puede usarlo
java.nio.file.Files.walkFileTree(...)
.Por ejemplo:
Si está utilizando Java 8, puede usar la interfaz de transmisión con
java.nio.file.Files.walk(...)
:fuente
Consulte la clase FileUtils en Apache Commons, específicamente iterateFiles :
fuente
Para Java 7+, también hay https://docs.oracle.com/javase/7/docs/api/java/nio/file/DirectoryStream.html
Ejemplo tomado del Javadoc:
fuente
Utilizando
org.apache.commons.io.FileUtils
Use false si no desea archivos de subdirectorios.
fuente
Es un árbol, así que la recursión es tu amiga: comienza con el directorio principal y llama al método para obtener una matriz de archivos secundarios. Iterar a través de la matriz secundaria. Si el valor actual es un directorio, páselo a una llamada recursiva de su método. De lo contrario, procese el archivo de hoja adecuadamente.
fuente
Como se señaló, este es un problema de recurrencia. En particular, es posible que desee mirar
En la API de Java File aquí . Devuelve una matriz de todos los archivos en un directorio. Usando esto junto con
para ver si necesita repetir aún más es un buen comienzo.
fuente
Para agregar con la respuesta @msandiford, como la mayoría de las veces cuando se recorre un árbol de archivos, es posible que desee ejecutar una función como un directorio o se visita cualquier archivo en particular. Si eres reacio a usar corrientes. Se pueden implementar los siguientes métodos anulados
fuente
También puede usar incorrectamente File.list (FilenameFilter) (y variantes) para el recorrido del archivo. Código corto y funciona en versiones tempranas de Java, por ejemplo:
fuente