對比 C# 的文件系統, 發現 C# 的文件系統貌似比 Java 的東西少一點, 竟然連刪除目錄都直接作好封裝了, 想到學 Java 的時候還要本身寫遞歸刪除, 好像沒寫過非遞歸的,就在網上查了下, 關於非遞歸刪除目錄代碼沒幾個, 我就寫了一個,遞歸網上一大堆, 就不粘上來了. 下面是代碼非遞歸的方法:java
1 package demo1; 2 3 import java.io.File; 4 import java.util.ArrayList; 5 6 public class Demo1 { 7 /** 8 * 不使用遞歸刪除目錄 9 * @param args 10 */ 11 public static void main(String[] args) { 12 deleteDirectory("E:\\test"); 13 } 14 15 public static void deleteDirectory(String rootPath) { 16 //fileList模擬的是一個隊列 17 ArrayList<File> fileList = new ArrayList<File>();//存儲文件和直接子目錄包含文件的目錄 18 //directoryList模擬的是一個棧 19 ArrayList<File> directoryList = new ArrayList<File>();//存儲直接子目錄不包含文件的目錄 20 File root = new File(rootPath); 21 if(!root.exists()){ 22 System.out.println("您輸入的不是目錄"); 23 return; 24 } 25 if(root.isFile()){ 26 root.delete(); 27 System.out.println("您輸入的是文件,已刪除成功"); 28 return; 29 } 30 fileList.add(0, root);//第一次入隊列 31 32 while(fileList.size() > 0) { 33 File dir = fileList.remove(0);//模擬一個出隊列的過程 【出隊列的也許文件,也許是目錄】 34 File[] files = dir.listFiles(); 35 for (int i = 0; i < files.length; i++) { 36 if(files[i].isFile()) files[i].delete();//若是是文件就刪除 37 else fileList.add(files[i]);//模擬一個入隊列的過程 【若是是目錄就入隊列】 38 } 39 directoryList.add(dir);//一次遍歷完畢,刪除了第一級的文件,模擬一個壓棧的過程【壓棧的確定是目錄,並且直接子目錄不包含文件】 40 } 41 //倒序遍歷,模擬一個彈粘的過程 42 for (int i = directoryList.size() - 1; i >= 0; i--) { 43 directoryList.get(i).delete(); 44 } 45 if(!root.exists()){ 46 System.out.println("您輸入的是文件夾,已刪除成功"); 47 } 48 } 49 50 }
其實使用 LinkedList 會更好一點,由於沒有查詢的過程,只有增刪。spa