(元)店長のITブログ

いまはJavaプログラマやってます。

【Java】File[]を更新日でソート

ディレクトリ内のファイルを更新日順でソートします。
Javaのversionは「1.8.0_111」で検証しています。

ディレクトリ構成

この配下を取得します。

input
       test001.csv
       test001.txt
       test001.xml

更新日は以下のようになっています。

ファイル名 -> 更新日
test001.csv -> 2017/10/24  22:11  
test001.txt -> 2017/12/08  11:31  
test001.xml -> 2017/10/30  21:11  

テストコード

まずは普通に取得してみます。

public class FileSort {

    /**
    * ファイルソート
    *
    * @param args
    */
    public static void main(String[] args) {
        File dir = new File("input/");
        File[] f = dir.listFiles();
        Arrays.asList(f).stream().forEach(i -> System.out.println(i.getName()));
    }
}

実行結果

標準だとファイル名の昇順でソートされています。

test001.csv
test001.txt
test001.xml

更新日順にソート

java.util.Arrays.sort」と「java.util.Comparator」を使用します。

import java.io.File;
import java.util.Arrays;
import java.util.Comparator;

public class FileSort {

    /**
    * ファイルソート
    *
    * @param args
    */
    public static void main(String[] args) {
        File dir = new File("input/");
        File[] f = dir.listFiles();
        Arrays.sort(f, new Comparator<File>() {
            @Override
            public int compare(File file1, File file2) {
                return file1.lastModified() >= file2.lastModified() ? 1 : -1;
            }
        });
        Arrays.asList(f).stream().forEach(i -> System.out.println(i.getName()));
    }
}

実行結果

test001.csv
test001.xml
test001.txt

想定結果が取得できました。
降順の場合はcompareメソッドの戻り値を逆にすればできます。

実際にコードを書くときには

return file1.lastModified() >= file2.lastModified() ? 1 : -1;

の箇所は条件を細かく書く必要があるのかな。