2011-07-21 30 views
12

Estoy tratando de obtener una lista de todos los archivos en un directorio y sus subdirectorios. Mi enfoque recursivo actual es la siguiente:Forma no recursiva de obtener todos los archivos en un directorio y sus subdirectorios en Java

private void printFiles(File dir) { 
    for (File child : dir.listFiles()) { 
    if (child.isDirectory()) { 
     printFiles(child); 
    } else if (child.isFile()) { 
     System.out.println(child.getPath()); 
    } 
    } 
} 

printFiles(new File("somedir/somedir2")); 

Sin embargo, esperaba que hubiera una manera no recursiva (una llamada API existente, tal vez) de hacer esto. Si no, ¿es esta la manera más limpia de hacer esto?

+5

posible duplicado de [enumerar de forma recursiva archivos en Java] (http://stackoverflow.com/questions/2056221/recursively-list-files-in-java). El título dice recursivamente, pero la primera respuesta es una llamada a la biblioteca. – Jacob

+0

@cularis No es un duplicado, ya que estoy tratando de hacerlo de forma no recursiva, mientras que la otra pregunta SO está pidiendo que se haga de forma recursiva. –

+0

¿Qué pasa con la recursión? No hay API para esto, sin embargo, todavía puedes hacerlo con un ciclo 'while' y algún otro negocio divertido, pero será complicado. –

Respuesta

23

Siempre se puede reemplazar una solución recursiva con un proceso iterativo mediante el uso de una pila (por DFS) o una cola (para BFS):

private void printFiles(File dir) { 
    Stack<File> stack = new Stack<File>(); 
    stack.push(dir); 
    while(!stack.isEmpty()) { 
    File child = stack.pop(); 
    if (child.isDirectory()) { 
     for(File f : child.listFiles()) stack.push(f); 
    } else if (child.isFile()) { 
     System.out.println(child.getPath()); 
    } 
    } 
} 

los archivos de impresión (nuevo archivo ("somedir/somedir2"));

+0

+1 para usar una pila –

+0

A veces no me gusta cuánto tiempo tarda Eclipse en comenzar. Bien hecho. Estoy muy sorprendido de por qué algunos ingenieros se preguntan por qué la recursión puede ser mala y por qué el uso de una Pila podría haber sido complicado. –

+0

El enfoque de la pila se ve mejor que el enfoque recursivo, ¡gracias! –

3

FileUtils es probablemente el mejor camino a seguir. (Copia de la pregunta VINCULADO) sólo se ha publicado que la gente busca esto va a verlo y probablemente no leer los comentarios

de edición: Métodos que se utilizarán ListFiles

+0

Quizás me falta algo, pero estaba mirando la documentación de FileUtils, y hay una nota debajo del constructor que dice "Las instancias NO deberían construirse en programación estándar". –

+1

sí ... Instancias ... debe usar los métodos estáticos que proporcionan. (por cierto, son casi todos estáticos) – RMT

+1

Perfecto, lo tengo, gracias! –

1

Java 8 en adelante, puede utilizar Files#walk hacer una lista de todos los archivos y directorios de forma recursiva en un directorio dado. Además, puede aplicar el filtro como Files::isRegularFile para filtrar los directorios si solo necesita archivos regulares.

Por otro lado, si solo necesita listar el directorio dado pero no sus subdirectorios, puede usar el método Files#list que solo le dará los archivos y directorios en el directorio dado. Puede volver a aplicar el filtro mencionado anteriormente.

Cuestiones relacionadas