2011-06-30 10 views
5

Esta es una pregunta horrible (en mi mente) y he hecho todo lo posible para encontrar documentación útil con poca suerte. De todos modos, aquí va:Java File.list() orden consistente?

Tengo un código que necesita hacer alguna operación en todos los archivos un directorio. Configuré el directorio en un objeto File y uso fileObject.list() para iterar sobre los archivos en el directorio. Dejé este código funcionando durante la noche y se bloqueó (después de mucho resuello) en algún momento. Estoy tratando de averiguar en qué momento sucedió esto (sí, tuve una tala horrible). Ahora, de acuerdo con this javadoc no hay garantía de un pedido (alfabético o de otro tipo) al listar los archivos, me pregunto si hay alguna garantía de coherencia. Es decir, cuando ejecuto el mismo código dos veces, ¿obtendré el mismo orden de archivos? La lógica me dice que debería y he reanudado las operaciones en base a eso, pero sospecho de esto. Además, tengo curiosidad sobre lo que "no significa una orden específica" del javadoc.

+1

Si quiere garantizar el pedido, ¿por qué no utilizar un 'Comparador'? – mre

+0

Los archivos pueden cambiar mientras la aplicación se está ejecutando ... por lo que podría hacer las cosas diferentes en cada ejecución. El orden probablemente dependa de la implementación del sistema de archivos. Lo más probable es que la respuesta sea "sí, hay consistencia", como si hicieras un "ls" o "dir" en una línea de comando, te dará consistencia pero no garantizará la clasificación alfabética. – ricosrealm

+0

Ah sí, lo haría (ahora), pero esto es para reanudar una ejecución que falló y no quiero repetir los archivos procesados. – kyun

Respuesta

13

Ese lenguaje significa que no debe confiar en ninguna propiedad de la orden, incluida la coherencia entre ejecución y ejecución.

Si hay una lista vinculada de archivos en alguna estructura de datos en memoria, un controlador podría mover el acceso más reciente al frente de la lista para optimizar el acceso repetido a los archivos. Esto podría cambiar el orden en que se enumeran los archivos aunque no se haya modificado ningún archivo.

Si quieres un orden coherente, se puede hacer algo como

Arrays.sort(
    myFileArray, 
    new Comparator<File>() { 
    public int compare(File a, File b) { 
     return a.getName().compareTo(b.getName()); 
    } 
    }); 
+1

Eso es preocupante. Y más o menos lo que esperaba. No tengo forma de saber qué archivos se procesaron y qué no. Con el horrible registro que es. El género tiene sentido, pero sería útil si quisiera comenzar todo de nuevo. ¡Gracias! – kyun

+4

Podría valer la pena investigar la nueva API 'WatchService' de java 7. http: // stackoverflow.com/questions/494869/file-changed-listener-in-java/494957 # 494957 –

+0

+1 para 'WatchService' ... ¡eso es sexy! – mre

0

Dado que los archivos que está viendo no cambian entre llamadas y dado que los ejecuta en la misma plataforma dos veces, creo que obtendrá los mismos resultados.

+0

¿Es mi esperanza también? Me pregunto si hay documentación a tal efecto que me tranquilice – kyun

+0

Básicamente, no confíe en la coherencia aquí . Me gusta la respuesta de Mike. – mkro

+0

Eso es tan importante, volvería a ejecutar el programa, pero al ordenar los archivos primero e implementar algunos log – woliveirajr

0

No hay ninguna garantía de orden, pero que yo sepa no hay ninguna "garantía de incompatibilidad", así que llamar dos veces, dado que no hay archivos han sido cambiados o tocados de alguna manera, probablemente le darán el mismo orden. Pero, si los estabas "procesando", probablemente se hayan tocado.

Para la cordura, le recomiendo que los ordene cuando los obtenga si va a confiar en la consistencia.

+0

:) Debería haber sido más claro. Los estoy leyendo, no los estoy editando. Por lo tanto, la estructura del directorio y los archivos que contiene no cambian. Dicho esto, como señala Mike Samuel, el sistema de archivos probablemente tendrá un papel que desempeñar en la orden, lo que significa que podría no obtener el mismo orden. – kyun

+0

Siempre puede probar y probar si se conserva el orden. Esa es la forma más sencilla de estar seguro si es lo suficientemente estable como para continuar la ejecución desde donde se detuvo. – trutheality

+0

Lo hice, y parecía estar bien. Pero eso es lo que llevó a la pregunta, preguntándose si eso siempre es cierto/simplemente afortunado esta vez – kyun

0

Como dice la documentación, no puede esperar ningún pedido de los archivos. En particular, dos llamadas posteriores pueden devolver diferentes ordenamientos. Si desea un pedido específico, p. alfabético, debe ordenar la lista usted mismo.

Cuestiones relacionadas