272 votes

Le meilleur moyen de lister les fichiers en Java, triés par date de modification?

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 était d'appeler File.listFiles et de simplement utiliser la liste basée sur File.lastModified, mais je me demandais s'il y avait un meilleur moyen.

Edit: Ma solution actuelle, comme suggéré, est d'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());
    } });
 

108voto

Dan Dyer Points 30082

Je pense que votre solution est la seule façon rationnelle. La seule façon d'obtenir la liste des fichiers est d'utiliser le Fichier.listFiles() et de la documentation précise que cela ne fait aucune garantie quant à l'ordre des fichiers retournés. Par conséquent, vous devez écrire un Comparateur qui utilise le Fichier.lastModified() et passez ce, ainsi que le tableau de fichiers, à des Tableaux.sort().

52voto

Jason Orendorff Points 15869

Cela pourrait être plus rapide si vous avez de nombreux fichiers. Il utilise le décorer-tri-undecorate de façon à ce que la date de dernière modification de chaque fichier est récupéré seulement une fois plutôt que chaque fois que l'algorithme de tri compare deux fichiers. Cela pourrait réduire le nombre d'appels d'e/S de O(n log n) O(n).

C'est plus de code, mais, si ce ne doit être utilisée que si vous êtes principalement concernées par la vitesse et il est sensiblement plus rapide dans la pratique (que je n'ai pas vérifié).

class Pair implements Comparable {
    public long t;
    public File f;

    public Pair(File file) {
        f = file;
        t = file.lastModified();
    }

    public int compareTo(Object o) {
        long u = ((Pair) o).t;
        return t < u ? -1 : t == u ? 0 : 1;
    }
};

// Obtain the array of (file, timestamp) pairs.
File[] files = directory.listFiles();
Pair[] pairs = new Pair[files.length];
for (int i = 0; i < files.length; i++)
    pairs[i] = new Pair(files[i]);

// Sort them by timestamp.
Arrays.sort(pairs);

// Take the sorted pairs and extract only the file part, discarding the timestamp.
for (int i = 0; i < files.length; i++)
    files[i] = pairs[i].f;

38voto

PhannGor Points 26

Quelle est l'approche similaire, mais sans boxe pour les objets longs:

 File[] files = directory.listFiles();

Arrays.sort(files, new Comparator<File>() {
    public int compare(File f1, File f2) {
        return Long.compare(f1.lastModified(), f2.lastModified());
    }
});
 

26voto

user17163 Points 473

Vous pouvez également regarder apache commons IO , il a construit en dernier comparateur modifié et de nombreux autres utilitaires sympas pour travailler avec des fichiers.

19voto

Matthew Madson Points 196

Si les fichiers que vous triez sont étant modifié / mis à jour pendant que le tri est effectué vous sera violé l’exigence de la transitivité du contrat général de la fonction publique de référence. Pour éviter ce problème potentiel, vous aurez envie de mettre en place une table de recherche statiques des dernières valeurs modifiées pour utiliser le comparateur pour chaque fichier, quelque chose comme ce qui suit :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X