ホームページ >Java >&#&チュートリアル >Java でディレクトリ ツリーを反復するにはどうすればよいですか?
Java でのディレクトリ ツリーの反復処理
ディレクトリを操作するときの一般的なタスクの 1 つは、ディレクトリ内のすべてのファイルとディレクトリを反復処理することです。指定されたディレクトリ。これにはサブディレクトリが含まれ、ディレクトリ ツリー全体への包括的なアクセスが提供されます。 Java では、この機能を実現するための標準的なアプローチがあります。
File#isDirectory():
Java の File クラスには、isDirectory() というメソッドがあります。ファイルがディレクトリを表すかファイルを表すかを判断するために使用されます。指定されたファイルがディレクトリの場合、ファイルとディレクトリのリストが含まれており、listFiles() メソッドを使用して取得できます。
Files#listFiles(): による再帰的アプローチ
ディレクトリ ツリーを反復処理する簡単な方法は、再帰を使用することです。次のスニペットは、このメソッドを示しています。
import java.io.File; public class DirectoryIterator { public static void main(String[] args) { File directory = new File("/path/to/dir"); showFiles(directory.listFiles()); } public static void showFiles(File[] files) { for (File file : files) { if (file.isDirectory()) { System.out.println("Directory: " + file.getAbsolutePath()); showFiles(file.listFiles()); // Recursive call } else { System.out.println("File: " + file.getAbsolutePath()); } } } }
このアプローチは、listFiles() によって返されたファイルのリストに対して showFiles() を再帰的に呼び出すことで機能します。ただし、StackOverflowError 例外を処理することが重要です。この例外は、ディレクトリ ツリーが深すぎて JVM のスタックが処理できない場合に発生する可能性があります。
Files#walk() for Tail Recursion:
Java 8 以降の場合、より効率的なアプローチは Files#walk() を使用することです。このメソッドは末尾再帰を実装しており、JVM スタックではなくメソッド呼び出しスタックで反復の状態を維持することで StackOverflowError 問題を回避します。
import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class DirectoryIteratorWithJava8 { public static void main(String[] args) throws Exception { Path directory = Paths.get("/path/to/dir"); Files.walk(directory).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()); } } }
Files#walk() は、次のことを表す Path オブジェクトのストリームを生成します。指定されたディレクトリ ツリー内のファイルとディレクトリ。次に、forEach() メソッドを使用して各 Path オブジェクトを処理し、対応するファイルまたはディレクトリを表示します。
以上がJava でディレクトリ ツリーを反復するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。