1. ホーム
  2. java

[解決済み] Javaでディレクトリとそのサブディレクトリにあるファイルを反復処理するにはどうしたらいいですか?

2022-04-24 22:36:49

質問

あるディレクトリにあるすべてのファイルのリストを取得したいのですが、すべてのサブディレクトリにあるファイルも含めて取得する必要があります。Javaでディレクトリの反復処理を実現する標準的な方法は何ですか?

どのように解決するのですか?

を使用することができます。 File#isDirectory() は、与えられたファイル(パス)がディレクトリであるかどうかをテストするために使用します。もしこれが true を使用すれば、同じメソッドを再度呼び出すだけです。 File#listFiles() の結果になります。これは、次のように呼ばれます。 再帰 .

基本的なキックオフの例です。

package com.stackoverflow.q3154488;

import java.io.File;

public class Demo {

    public static void main(String... args) {
        File dir = new File("/path/to/dir");
        showFiles(dir.listFiles());
    }

    public static void showFiles(File[] files) {
        for (File file : files) {
            if (file.isDirectory()) {
                System.out.println("Directory: " + file.getAbsolutePath());
                showFiles(file.listFiles()); // Calls same method again.
            } else {
                System.out.println("File: " + file.getAbsolutePath());
            }
        }
    }
}

に対して敏感であることに注意してください。 StackOverflowError ツリーがJVMのスタックが保持できるよりも深い場合。もし、あなたがすでにJava 8かそれ以降を利用しているなら、そのときは Files#walk() を使用する代わりに 末尾再帰 :

package com.stackoverflow.q3154488;

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

public class DemoWithJava8 {

    public static void main(String... args) throws Exception {
        Path dir = Paths.get("/path/to/dir");
        Files.walk(dir).forEach(path -> showFile(path.toFile()));
    }

    public static void showFile(File file) {
        if (file.isDirectory()) {
            System.out.println("Directory: " + file.getAbsolutePath());
        } else {
            System.out.println("File: " + file.getAbsolutePath());
        }
    }
}