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()))
);
Java2. フォルダ優先 → ファイル(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())
);
Java3. 複合条件(サイズ降順 → 名前昇順)
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を使うと「サイズ→名前→日付」など複数条件でソート可能。
