Java >> Java Program >  >> Java

Bästa sättet att lista filer i Java, sorterade efter Ändrad datum?

Jag tror att din lösning är det enda vettiga sättet. Det enda sättet att få listan över filer är att använda File.listFiles() och dokumentationen säger att detta inte ger några garantier om ordningen på de returnerade filerna. Därför måste du skriva en komparator som använder File.lastModified() och skicka denna, tillsammans med arrayen av filer, till Arrays.sort().


Elegant lösning sedan Java 8:

File[] files = directory.listFiles();
Arrays.sort(files, Comparator.comparingLong(File::lastModified));

Eller, om du vill ha det i fallande ordning, vänd bara om det:

File[] files = directory.listFiles();
Arrays.sort(files, Comparator.comparingLong(File::lastModified).reversed());

Detta kan vara snabbare om du har många filer. Detta använder mönstret dekorera-sort-odekorera så att det senast ändrade datumet för varje fil bara hämtas en gång snarare än varje gång sorteringsalgoritmen jämför två filer. Detta minskar potentiellt antalet I/O-anrop från O(n log n) till O(n).

Det är dock mer kod, så det här bör bara användas om du huvudsakligen är intresserad av hastighet och det är mätbart snabbare i praktiken (vilket jag inte har kontrollerat).

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;

Java-tagg