すべてのサブディレクトリ内のファイルを含む、ディレクトリ内のすべてのファイルのリストを取得する必要があります。Java でディレクトリの反復処理を実行する標準的な方法は何ですか?
ベストアンサー1
使用できます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());
}
}
}