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 会更好一点,因为没有查询的过程,只有增删。

posted @ 2017-02-26 22:00 码上猿梦 阅读(...) 评论(...) 编辑 收藏