在 Java 中迭代目錄樹
使用目錄時的常見任務之一是迭代其中的所有檔案和目錄指定的目錄。這包括子目錄,提供對整個目錄樹的全面存取。在 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中文網其他相關文章!