2009-04-24 10 views
5

Quiero poner en práctica un método como este:cómo implementar un método para devolver Iterador de archivos de forma recursiva en Java

public Iterator<File> getFiles(String root) { 
    // return an Iterator looping through all files in root and all files in sub-directories of roots (recursively) 
} 

En C#, esto fácilmente se puede implementar con la palabra clave yield return. En Java, sospecho que tengo que terminar escribiendo un código complicado para hacerlo. ¿Hay alguna buena solución para este problema?

Editar: Quiero que el iterador devuelto sea "flojo", es decir, que solo devuelva un nuevo archivo cuando se invoca next(). (Ese es el comportamiento de C# yield return ofertas.)

+0

¿Puedes explicar por qué quieres que sea flojo? –

+1

Como no paso necesariamente todo el siguiente(), es posible que desee detenerme en el medio (es decir, que los usuarios hagan clic en Detener). La carga ansiosa de una estructura de directorios muy profunda es costosa si no la necesitamos. –

Respuesta

3

Apache Commons FileUtils ofrece iterator métodos para iterar a través de directorios y subdirectorios. Eso hace lo que quiere y debería ahorrarle mucho trabajo.

p. Ej.

Iterator fi = iterateFiles(new File("."), String[] {".csv"}, true)

para encontrar todos los archivos .csv por debajo del directorio actual.

+1

Cuando miro el código fuente, resulta que el código agrega todos los archivos a una colección y finalmente llama al método iterator() en esa colección. Quiero un iterador perezoso, no ansioso de cargar. He actualizado la publicación original. Gracias por traer esto de todos modos, será muy útil en otras ocasiones. –

+0

Ok. En ese caso, creo que puede necesitar un método recursivo y proporcionar su propio objeto de devolución de llamada. Por desgracia, no tengo ninguno en la cabeza. –

+0

no funciona para iterar la carpeta a pesar de –

0

que podría haber perdido algo, pero ¿por qué no acaba de hacer su propio iterador clase que implementa iterador. Entonces solo necesita implementar un método next() flojo en su iterador.

+0

Claro que es algo que haría a menos que alguien ya resolviera ese problema de una manera más inteligente que podría llegar a producir. Y esta respuesta parece sugerir 1 de tales soluciones http://stackoverflow.com/questions/785228/how-to-implement-a-method-to-return-iterator-of-files-recursively-in-java/785236# 785236 –

Cuestiones relacionadas