Java实现非递归删除目录
对比 C# 的文件系统, 发现 C# 的文件系统貌似比 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 会更好一点,因为没有查询的过程,只有增删。