Je veux obtenir une liste de fichiers dans un répertoire, mais je veux le trier de telle sorte que les fichiers les plus anciens soient les premiers. Ma solution a été d'appeler File.listFiles et de simplement recourir à la liste basée sur File.lastModified, mais je me demandais s'il y avait une meilleure façon.
Edit: Ma solution actuelle, comme suggéré, consiste à utiliser un comparateur anonyme:
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()
énormément de fois. Mieux vaut obtenir toutes les dates en premier et commander plus tard, afin que celafile.lastModified()
ne soit appelé qu'une fois par fichier.Arrays.sort(files, LastModifiedFileComparator.LASTMODIFIED_REVERSE);
Arrays.sort(files, Comparator.comparingLong(File::lastModified));
Réponses:
Je pense que votre solution est la seule solution sensée. La seule façon d'obtenir la liste des fichiers est d'utiliser File.listFiles () et la documentation indique que cela ne garantit pas l'ordre des fichiers retournés. Par conséquent, vous devez écrire un comparateur qui utilise File.lastModified () et le transmettre, avec le tableau de fichiers, à Arrays.sort () .
la source
Cela pourrait être plus rapide si vous avez plusieurs fichiers. Cela utilise le modèle décorer-trier-décorer afin que la date de dernière modification de chaque fichier soit extraite une seule fois plutôt que chaque fois que l'algorithme de tri compare deux fichiers. Cela réduit potentiellement le nombre d'appels d'E / S de O (n log n) à O (n).
C'est plus de code, cependant, donc cela ne devrait être utilisé que si vous êtes principalement préoccupé par la vitesse et c'est beaucoup plus rapide en pratique (ce que je n'ai pas vérifié).
la source
Solution élégante depuis Java 8:
Ou, si vous le souhaitez dans l'ordre décroissant, inversez-le simplement:
la source
files.sort(Comparator.comparingLong(File::lastModified));
ArrayList<File> files = new ArrayList<File>(Arrays.asList(directory.listFiles()))
, ce n'est pas plus simple que justeFile[] files = directory.listFiles()
.ArrayList<File>(...)
dans le commentaire viniciussss est nécessaire pour obtenir une liste mutable qui peut être triée.) J'ai trouvé ce fil à la recherche d'un moyen de trier une liste de fichiers. J'ai donc ajouté ce code pour que les gens puissent simplement le copier s'ils ont aussi des listes.Comparator
classe n'a pas d'appel de méthodecomparingLong
Qu'en est-il d'une approche similaire, mais sans encadrer les objets longs:
la source
Vous pouvez également consulter apache commons IO , il dispose d'un dernier comparateur modifié et de nombreux autres utilitaires agréables pour travailler avec des fichiers.
la source
En Java 8:
Arrays.sort(files, (a, b) -> Long.compare(a.lastModified(), b.lastModified()));
la source
Importations:
Apache Commons
Code:
la source
Si les fichiers que vous triez peuvent être modifiés ou mis à jour en même temps que le tri est effectué:
Java 8+
Java 7
Ces deux solutions créent une structure de données de carte temporaire pour économiser une heure de dernière modification constante pour chaque fichier du répertoire. La raison pour laquelle nous devons le faire est que si vos fichiers sont mis à jour ou modifiés pendant que votre tri est effectué, votre comparateur violera l'exigence de transitivité du contrat général de l'interface du comparateur car les dernières heures modifiées peuvent changer pendant la comparaison.
Si, d'autre part, vous savez que les fichiers ne seront pas mis à jour ou modifiés pendant votre tri, vous pouvez vous en tirer avec à peu près n'importe quelle autre réponse soumise à cette question, dont je suis partielle:
Java 8+ (pas de modifications simultanées pendant le tri)
Remarque: Je sais que vous pouvez éviter la traduction vers et depuis les objets File dans l'exemple ci-dessus en utilisant l' API Files :: getLastModifiedTime dans l'opération de flux trié, cependant, vous devez alors traiter les exceptions d'E / S vérifiées dans votre lambda, ce qui est toujours un problème . Je dirais que si les performances sont suffisamment critiques pour que la traduction soit inacceptable, je traiterais soit l'exception IOException vérifiée dans la lambda en la propageant comme une exception UncheckedIOException, soit je renoncerais complètement à l'API Files et ne traiterais qu'avec les objets File:
la source
la source
où
listFiles
est la collection de tous les fichiers dans ArrayListla source
Vous pouvez essayer la commande de goyave :
la source
Vous pouvez utiliser la bibliothèque Apache LastModifiedFileComparator
la source
la source
Je suis venu à ce poste lorsque je cherchais le même problème, mais dans
android
. Je ne dis pas que c'est le meilleur moyen d'obtenir des fichiers triés par date de dernière modification, mais c'est le moyen le plus simple que j'ai trouvé à ce jour.Le code ci-dessous peut être utile à quelqu'un-
Merci
la source
for
boucle, vous pouvez voir que j'ai prislist.length-1
jusqu'ài >=0
ce qui vous répète simplement dans l'ordre inverse.Il existe un moyen très simple et pratique de gérer le problème sans comparateur supplémentaire. Codez simplement la date modifiée dans la chaîne avec le nom de fichier, triez-la, puis supprimez-la à nouveau.
Utilisez une chaîne de longueur fixe 20, mettez-y la date modifiée (longue) et remplissez-la avec des zéros non significatifs. Ensuite, ajoutez simplement le nom de fichier à cette chaîne:
Qu'est-ce qui se passe ici:
Nom de fichier1: C: \ data \ file1.html Dernière modification: 1532914451455 Dernière modification à 20 chiffres: 00000001532914451455
Nom de fichier1: C: \ data \ file2.html Dernière modification: 1532918086822 Dernière modification à 20 chiffres: 00000001532918086822
transforme les noms de fichiers en:
Nom de fichier1: 00000001532914451455C: \ data \ file1.html
Nom de fichier2: 00000001532918086822C: \ data \ file2.html
Vous pouvez alors simplement trier cette liste.
Tout ce que vous devez faire est de supprimer les 20 caractères à nouveau plus tard (dans Java 8, vous pouvez les supprimer pour l'ensemble du tableau avec une seule ligne à l'aide de la fonction .replaceAll)
la source
Il existe également une manière complètement différente qui peut être encore plus facile, car nous ne traitons pas les grands nombres.
Au lieu de trier l'ensemble du tableau après avoir récupéré tous les noms de fichiers et les dates lastModified, vous pouvez simplement insérer chaque nom de fichier juste après l'avoir récupéré à la bonne position de la liste.
Vous pouvez le faire comme ceci:
Après avoir ajouté object2 à la position 2, il déplacera object3 à la position 3.
la source