날짜를 기준으로 정렬하여 Java로 파일을 나열하는 가장 좋은 방법은 무엇입니까? 가져오고 싶지만 가장 오래된 파일이 먼저 정렬되도록

디렉토리에 파일 목록을 가져오고 싶지만 가장 오래된 파일이 먼저 정렬되도록 정렬하고 싶습니다. 내 솔루션은 File.listFiles를 호출하고 File.lastModified를 기반으로 목록을 작성하는 것이었지만 더 나은 방법이 있는지 궁금했습니다.

편집 : 내 현재 솔루션은 제안 된대로 익명의 비교기를 사용하는 것입니다.

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.listFiles () 를 사용 하는 것이며 문서는 반환 된 파일의 순서를 보증하지 않습니다. 따라서 File.lastModified () 를 사용 하는 Comparator 를 작성하고 이를 파일 배열과 함께 Arrays.sort ()에 전달해야 합니다.


답변

파일이 많은 경우 더 빠를 수 있습니다. 이것은 sortate-sort-undecorate 패턴을 사용하므로 정렬 알고리즘이 두 파일을 비교할 때마다가 아니라 각 파일의 마지막 수정 날짜를 한 번만 가져옵니다 . 이는 잠재적으로 O (n log n)에서 O (n)으로의 I / O 호출 수를 줄입니다.

그러나 더 많은 코드이므로 속도에 주로 관심이 있고 실제로 확인하지 않은 경우 훨씬 빠릅니다.

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 8 이후의 우아한 솔루션 :

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

또는 내림차순으로 원하면 뒤집으십시오.

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

답변

비슷한 접근 방식에 관한 것이지만 Long 객체에는 권투가 없습니다.

File[] files = directory.listFiles();

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

답변

또한 apache commons IO를 살펴볼 수 있으며 마지막으로 수정 된 비교기 와 파일 작업을위한 많은 다른 유용한 유틸리티가 있습니다.


답변

자바 8 :

Arrays.sort(files, (a, b) -> Long.compare(a.lastModified(), b.lastModified()));


답변

수입 :

org.apache.commons.io.comparator.LastModifiedFileComparator

아파치 커먼즈

코드 :

public static void main(String[] args) throws IOException {
        File directory = new File(".");
        // get just files, not directories
        File[] files = directory.listFiles((FileFilter) FileFileFilter.FILE);

        System.out.println("Default order");
        displayFiles(files);

        Arrays.sort(files, LastModifiedFileComparator.LASTMODIFIED_COMPARATOR);
        System.out.println("\nLast Modified Ascending Order (LASTMODIFIED_COMPARATOR)");
        displayFiles(files);

        Arrays.sort(files, LastModifiedFileComparator.LASTMODIFIED_REVERSE);
        System.out.println("\nLast Modified Descending Order (LASTMODIFIED_REVERSE)");
        displayFiles(files);

    }