用遞歸實現目錄刪除和樹形目錄展示
遞歸
所謂遞歸(Recursion),就是方法調用自身。
對於遞歸來說,一定有一個出口,讓遞歸結束。這樣才能保證不出現死循環。
關於遞歸,比較簡單且典型的例子是計算階乘、計算斐波那契數列等。
本文是在學習Java的File類時遇到的兩個實際問題,一個是文件刪除,另一個是將文件目錄用樹形結構顯示(利用縮進),這兩個問題都可以用遞歸解決。
解決刪除文件的問題
File類中刪除文件或目錄的方法是:
public boolean delete()
如果要刪除的是一個目錄,則要求目錄必須為空。這在很多時候是不能滿足的,那么就需要進入到這個目錄中,先將其中所有的子目錄和文件都刪除;對於其中不為空的子目錄,又得繼續進行這個過程,所以這是一個遞歸的過程。
程序實現如下:

import java.io.File; public class DeleteTest { public static void deleteAll(File file) { if (file.isFile() || file.list().length == 0) { // 遞歸出口:如果file為文件或者空目錄,則調用delete方法可以刪除 file.delete(); } else { // 非空目錄不能直接刪除 // 獲取待刪除目錄下的所有File對象 File[] files = file.listFiles(); for (File f : files) { // 刪除里面的所有文件及目錄 deleteAll(f); } // 刪除本目錄 file.delete(); } } public static void main(String[] args) { DeleteTest.deleteAll(new File("D://abc"));// 給出待刪除的路徑 // 注意:此處刪除的文件不會進入回收站,而是直接刪除,所以請謹慎 } }
展現樹形目錄
給定任意一個目錄,以樹形方式展現出該目錄中的所有子目錄和文件,每一層要加上縮進。

import java.io.File; public class TreeDirectoryTest { public static int depth = 0; public static void deepList(File file) { if (file.isFile() || 0 == file.list().length) { if (file.isDirectory()) { // 目錄后面加上\表示區分 System.out.println(getTabs(depth) + file.getName() + "\\"); } else { System.out.println(getTabs(depth) + file.getName()); } return; } else { System.out.println(getTabs(depth) + file.getName() + "\\"); File[] files = file.listFiles(); for (File f : files) { depth++; deepList(f); depth--;// 保持本層的depth不變 } } } // 得到合適的縮進 private static String getTabs(int number) { StringBuffer tabs = new StringBuffer(); for (int i = 0; i < number; ++i) { tabs.append("\t"); } return tabs.toString(); } public static void main(String[] args) { TreeDirectoryTest.deepList(new File("D:\\Media")); } }
程序還有很多待完善的地方,比如展示時可以加入排序,將目錄排在同級的文件前面。
參考資料
聖思園張龍老師Java SE系列視頻教程。