概要

Javaの標準ライブラリにあるPathやFilesを使うとファイルの操作が出来ますが、それにはディレクトリ内のファイルの列挙も含まれています。Filesのメソッドlistにディレクトリを表すPathを渡せばディレクトリ内のファイルをStream<Path>で返してくれます。このStreamはcloseを呼び出した方が良いとJavaDocにも書かれているのでlistを呼び出すときにtry-with-resources文を使っていきましょう。では、ディレクト内のファイル列挙とその中にディレクトリがあればその中のファイルも列挙できるサンプルを用意したので見てみましょう

ソースコード

import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.Files;

import java.io.IOException;

public class FileListSample{
    public static void main(String... args){
        //現在のディレクトリ
        var path = Paths.get("");

        FileListSample.printFiles(path);
    }
    
    private static void printFiles(Path dir){
        try(var files = Files.list(dir)){
            files.forEach(file -> {
                //ファイル名を絶対パスで表示
                System.out.println(file.toAbsolutePath().toString());

                if(Files.isDirectory(file)){
                    //ディレクトリならそのディレクトリの内部も探索
                    FileListSample.printFiles(file);
                }
            });
        }catch(IOException e){
            e.printStackTrace();
        }
    }
}

説明

サンプルが短いのとコメントがあるため、特に説明する部分はないかと思いますが昔のJavaでFileクラスを使ったことがある人はgetAbsolutePathを呼び出した経験があるかもしれません。しかしPathにはtoAbsolutePathという名前のメソッドで微妙に名前が違うのと返ってくるのがStringではなくPathな点に注意が必要です。まぁ、ある意味名前の通りだけど以前のJavaに慣れていると紛らわしい…余裕がある人はStream APIでmapやfilterを使って遊んでみてください!