Java でファイル ディレクトリのサブディレクトリを反復処理する
Java でファイルを操作する場合、多くの場合、ファイル ディレクトリ内のファイルにアクセスするだけでなく、ディレクトリだけでなく、そのサブディレクトリ内のものも含まれます。ここで次のような疑問が生じます: Java でディレクトリとそのサブディレクトリを効率的に移動するにはどうすればよいですか?
再帰: 標準的なアプローチ
ディレクトリ反復の標準的な手法には、次のようなものがあります。再帰。 File#isDirectory() メソッドを使用して特定のファイルがディレクトリであるかどうかをテストすることにより、File#listFiles() の結果を使用して同じメソッドを再帰的に呼び出します。
次のコード スニペットは、この再帰的なアプローチを示しています。
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()); } } } }
Java 8 の代替: 末尾再帰Files#walk()
Java 8 以降のバージョンでは、Files#walk() メソッドが再帰の代替手段となります。末尾再帰を採用し、深いディレクトリ ツリーがある状況での StackOverflowError のリスクを回避します。
ディレクトリの反復に Files#walk() を使用する方法は次のとおりです。
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()); } } }
結論
File#isDirectory() と File#listFiles() による再帰を利用するまたは、Java 8 で Files#walk() を使用すると、Java アプリケーション内のディレクトリ ファイルとサブディレクトリ ファイルの両方を効果的に反復処理できます。
以上がJava でファイル ディレクトリとそのサブディレクトリを効率的に移動するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。