專案中常需掃描指定目錄並以樹狀縮排形式列印所有檔案與子目錄。本文提供一個輕量、無依賴的 Java 工具類,支援自訂根路徑、自動計算層級縮排,並附上執行結果範例。
import java.io.File;
public class DirectoryTreePrinter {
private int baseLevel; // 根目錄層級基準
/** 產生帶縮排的列印字串 */
private String buildLine(String name, int level) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < level; i++) sb.append(" "); // 4 空格縮排
sb.append("├─ ").append(name);
return sb.toString();
}
/** 列印根目錄路徑各層級名稱 */
public void printRootPath(String rootPath) {
String[] parts = rootPath.split("[\\\\/]"); // 相容 Windows/Unix 分隔符
baseLevel = parts.length;
for (int i = 0; i < parts.length; i++) {
System.out.println(buildLine(parts[i], i));
}
}
/** 遞歸遍歷並列印檔案樹 */
public void printTree(String dirPath) {
File dir = new File(dirPath);
File[] files = dir.listFiles();
if (files == null) return; // 路徑不存在或非目錄
for (File file : files) {
int level = baseLevel + getDepth(file, dir);
System.out.println(buildLine(file.getName(), level));
if (file.isDirectory()) {
printTree(file.getAbsolutePath());
}
}
}
/** 計算檔案相對於根目錄的深度 */
private int getDepth(File file, File root) {
int depth = 0;
File cur = file;
while (cur != null && !cur.equals(root)) {
depth++;
cur = cur.getParentFile();
}
return depth;
}
public static void main(String[] args) {
DirectoryTreePrinter printer = new DirectoryTreePrinter();
String target = "D:/YoudaoDict"; // 請替換為實際存在的目錄
printer.printRootPath(target);
printer.printTree(target);
}
}
D: ├─ YoudaoDict │ ├─ dict.db │ ├─ log │ │ ├─ 2023-01-01.log │ │ └─ 2023-01-02.log │ ├─ plugins │ │ ├─ plugin_a.jar │ │ └─ plugin_b.jar │ └─ config.xml
FileFilter 或 regex 只列印特定副檔名。System.out 替換為 PrintWriter 寫入檔案或 StringBuilder 回傳字串。Files.walkFileTree() 可獲得更豐富的屬性與更佳效能。JTree 或 JavaFX TreeView 顯示互動式目錄樹。此工具類碼量極小、零依賴,適合快速整合至專案中進行目錄結構檢視與除錯。