Quiero obtener una lista de archivos en un directorio, pero quiero ordenarla de modo que los archivos más antiguos sean los primeros. Mi solución fue llamar a File.listFiles y simplemente recurrir a la lista basada en File.lastModified, pero me preguntaba si había una mejor manera.
Editar: mi solución actual, como se sugiere, es usar un comparador anónimo:
File[] files = directory.listFiles();
Arrays.sort(files, new Comparator<File>(){
public int compare(File f1, File f2)
{
return Long.valueOf(f1.lastModified()).compareTo(f2.lastModified());
} });
file.lastModified()
una gran cantidad de veces. Mejor obtenga todas las fechas primero y ordene después, para quefile.lastModified()
solo se llame una vez por archivo.Arrays.sort(files, LastModifiedFileComparator.LASTMODIFIED_REVERSE);
Arrays.sort(files, Comparator.comparingLong(File::lastModified));
Respuestas:
Creo que su solución es la única forma sensata. La única forma de obtener la lista de archivos es usar File.listFiles () y la documentación indica que esto no garantiza el orden de los archivos devueltos. Por lo tanto, debe escribir un Comparador que use File.lastModified () y pasar esto, junto con la matriz de archivos, a Arrays.sort () .
fuente
Esto podría ser más rápido si tiene muchos archivos. Esto usa el patrón decorate-sort-undecorate para que la última fecha de modificación de cada archivo se recupere solo una vez lugar de cada vez que el algoritmo de clasificación compara dos archivos. Potencialmente, esto reduce la cantidad de llamadas de E / S de O (n log n) a O (n).
Sin embargo, es más código, por lo que solo se debe usar si le preocupa principalmente la velocidad y es mucho más rápido en la práctica (lo cual no he comprobado).
fuente
Solución elegante desde Java 8:
O, si lo desea en orden descendente, simplemente inviértalo:
fuente
files.sort(Comparator.comparingLong(File::lastModified));
ArrayList<File> files = new ArrayList<File>(Arrays.asList(directory.listFiles()))
, eso no es más fácil que simplementeFile[] files = directory.listFiles()
.ArrayList<File>(...)
se necesita ese 'adicional' en el comentario de viniciussss para obtener una lista mutable que se pueda ordenar). Encontré este hilo buscando una manera de ordenar una lista de archivos. Así que acabo de agregar ese código para que las personas simplemente puedan copiarlo si tienen listas también.Comparator
clase no tiene ninguna llamada a métodocomparingLong
¿Qué pasa con un enfoque similar, pero sin boxeo a los objetos largos:
fuente
También puede mirar Apache commons IO , tiene un comparador modificado modificado por última vez y muchas otras buenas utilidades para trabajar con archivos.
fuente
En Java 8:
Arrays.sort(files, (a, b) -> Long.compare(a.lastModified(), b.lastModified()));
fuente
Importaciones:
Apache Commons
Código:
fuente
Si los archivos que está ordenando se pueden modificar o actualizar al mismo tiempo que se realiza la clasificación:
Java 8+
Java 7
Ambas soluciones crean una estructura de datos de mapa temporal para ahorrar un tiempo constante de última modificación para cada archivo en el directorio. La razón por la que debemos hacer esto es que si sus archivos se actualizan o modifican mientras se realiza su clasificación, su comparador violará el requisito de transitividad del contrato general de la interfaz del comparador porque los últimos tiempos modificados pueden estar cambiando durante la comparación.
Si, por otro lado, sabe que los archivos no se actualizarán o modificarán durante su ordenación, puede salirse con casi cualquier otra respuesta enviada a esta pregunta, de la cual estoy parcial a:
Java 8+ (sin modificaciones concurrentes durante la ordenación)
Nota: Sé que puede evitar la traducción hacia y desde los objetos File en el ejemplo anterior mediante el uso de Files :: getLastModifiedTime api en la operación de flujo ordenado, sin embargo, debe lidiar con las excepciones de IO comprobadas dentro de su lambda, que siempre es un problema . Diría que si el rendimiento es lo suficientemente crítico como para que la traducción sea inaceptable, entonces trataría con la IOException marcada en el lambda propagándola como UncheckedIOException o renunciaría a la API de Archivos por completo y trataría solo con objetos File:
fuente
fuente
donde
listFiles
está la colección de todos los archivos en ArrayListfuente
Puedes probar el pedido de guayaba :
fuente
Puede usar la biblioteca Apache LastModifiedFileComparator
fuente
fuente
Llegué a esta publicación cuando estaba buscando el mismo problema pero en
android
. No digo que esta sea la mejor manera de ordenar los archivos por fecha de última modificación, pero es la forma más fácil que encontré hasta ahora.El siguiente código puede ser útil para alguien
Gracias
fuente
for
bucle, puede ver que he tomadolist.length-1
hastai >=0
que simplemente lo itera en orden inverso.Hay una manera muy fácil y conveniente de manejar el problema sin ningún comparador adicional. Simplemente codifique la fecha modificada en la Cadena con el nombre del archivo, ordénelo y luego quítelo nuevamente.
Use una cadena de longitud fija 20, coloque la fecha de modificación (larga) en ella y complete con ceros a la izquierda. Luego solo agregue el nombre del archivo a esta cadena:
Lo que pasa es esto aquí:
Nombre de archivo1: C: \ data \ file1.html Última modificación: 1532914451455 Última modificación de 20 dígitos: 00000001532914451455
Nombre de archivo1: C: \ data \ file2.html Última modificación: 1532918086822 Última modificación de 20 dígitos: 00000001532918086822
transforma los nombres de archivo a:
Nombre de archivo1: 00000001532914451455C: \ data \ file1.html
Nombre de archivo2: 00000001532918086822C: \ data \ file2.html
Entonces puede simplemente ordenar esta lista.
Todo lo que necesita hacer es quitar los 20 caracteres más tarde (en Java 8, puede quitarlos para toda la matriz con solo una línea usando la función .replaceAll)
fuente
También hay una forma completamente diferente que puede ser aún más fácil, ya que no tratamos con grandes números.
En lugar de ordenar toda la matriz después de recuperar todos los nombres de archivo y las últimas fechas modificadas, puede insertar cada nombre de archivo justo después de recuperarlo en la posición correcta de la lista.
Puedes hacerlo así:
Después de agregar object2 a la posición 2, moverá object3 a la posición 3.
fuente