카테고리 보관물: Java

Java

날짜를 기준으로 정렬하여 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);

    }