Antes que nada, ¿tiene alguna posibilidad de usar Java 7? Ahí tienes un FileVisitor
y el Files.walkFileTree
, que probablemente debería funcionar dentro de tus limitaciones de memoria.
De lo contrario, la única manera que se me ocurre es utilizar
File.listFiles(FileFilter filter)
con un filtro que siempre devuelve
false
(asegurando que toda la gama de archivos nunca se guarda en la memoria), pero que las capturas de los archivos que se procesan a lo largo del manera, y tal vez los coloca en una cola de productor/consumidor o escribe los nombres de archivo en el disco para un recorrido posterior.
Alternativamente, si el control de los nombres de los archivos, o si se nombran de alguna manera agradable, se podía procesar los archivos en trozos usando un filtro que acepta nombres de archivo en el formulario file0000000
- filefile0001000
continuación file0001000
- filefile0002000
y así en.
Si los nombres son
no llamado de una manera agradable de esta manera, usted podría tratar de filtrarlas basado en el hash en clave del nombre de archivo, que se supone que es bastante distribuido de manera uniforme sobre el conjunto de los enteros.
Actualización: suspiro. Probablemente no funcionará. Acaba de tener un vistazo a la implementación listFiles:
public File[] listFiles(FilenameFilter filter) {
String ss[] = list();
if (ss == null) return null;
ArrayList v = new ArrayList();
for (int i = 0 ; i < ss.length ; i++) {
if ((filter == null) || filter.accept(this, ss[i])) {
v.add(new File(ss[i], this));
}
}
return (File[])(v.toArray(new File[v.size()]));
}
por lo que es probable fallar en la primera línea de todos modos ... Una especie de decepcionante. Creo que su mejor opción es colocar los archivos en diferentes directorios.
Btw, ¿podría dar un ejemplo de un nombre de archivo? ¿Son "adivinables"? Al igual que
for (int i = 0; i < 100000; i++)
tryToOpen(String.format("file%05d", i))
Lo sentimos, pero ¿qué sistema operativo no es compatible con eso? ¿Vivir en 1950? Sé de varias herramientas que explotan, por ejemplo, en Windows (el explorador se pone extremadamente lento), pero el sistema de archivos lo admite. – TomTom
@TomTom: FAT32 (antiguo, pero de ninguna manera era 1950, y aún bastante común) tiene un límite de archivos por directorio de 65k. –
Pero suponiendo que alguien use eso es negligente, excepto por dispositivos que no lo soportan, y luego el problema, adivinen qué, no sería un "problema al listar los archivos". – TomTom