Java | Stream API を使ったファイル情報のソート

Java Java
スポンサーリンク

Java 8 以降で導入された Stream API を使うと、ファイル情報のソートをより宣言的に書けます。ここでは「ファイル一覧を取得して、サイズや更新日時でソートする」例をいくつか紹介します。


基本構造

import java.io.File;
import java.util.*;
import java.util.stream.*;

public class StreamFileSort {
    public static void main(String[] args) {
        File dir = new File("C:/example"); // 任意のフォルダ
        File[] files = dir.listFiles();
        if (files == null) {
            System.out.println("フォルダが存在しないかアクセスできません");
            return;
        }

        // Streamに変換
        List<File> sorted = Arrays.stream(files)
            .filter(File::isFile) // ファイルのみ対象(フォルダ除外)
            .sorted(Comparator.comparingLong(File::length)) // サイズ昇順
            .collect(Collectors.toList());

        // 結果表示
        sorted.forEach(f -> {
            double sizeMB = f.length() / (1024.0 * 1024.0);
            System.out.printf("%-30s : %.2f MB%n", f.getName(), sizeMB);
        });
    }
}
Java

応用例

1. 更新日時でソート(新しい順)

List<File> sortedByDate = Arrays.stream(files)
    .sorted(Comparator.comparingLong(File::lastModified).reversed())
    .collect(Collectors.toList());

sortedByDate.forEach(f -> 
    System.out.println(f.getName() + " : " + new Date(f.lastModified()))
);
Java

2. フォルダ優先 → ファイル(Explorer風)

List<File> explorerLike = Arrays.stream(files)
    .sorted(Comparator
        .comparing(File::isDirectory).reversed() // true=フォルダを先に
        .thenComparing(File::getName, String.CASE_INSENSITIVE_ORDER))
    .collect(Collectors.toList());

explorerLike.forEach(f -> 
    System.out.println((f.isDirectory() ? "[DIR] " : "[FILE] ") + f.getName())
);
Java

3. 複合条件(サイズ降順 → 名前昇順)

List<File> complexSort = Arrays.stream(files)
    .sorted(Comparator
        .comparingLong(File::length).reversed()
        .thenComparing(File::getName))
    .collect(Collectors.toList());

complexSort.forEach(f -> {
    double sizeMB = f.length() / (1024.0 * 1024.0);
    System.out.printf("%-30s : %.2f MB%n", f.getName(), sizeMB);
});
Java

ポイントまとめ

  • Arrays.stream(files)File[] を Stream に変換。
  • filter で条件を絞り込み(例: ファイルのみ)。
  • sorted(Comparator...) で柔軟なソート条件を指定。
  • collect(Collectors.toList()) で結果をリストにまとめる。
  • 複合条件: thenComparing を使うと「サイズ→名前→日付」など複数条件でソート可能。
Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました