zoukankan      html  css  js  c++  java
  • Java IO 用递归实现目录删除和树形目录展示 Java实现

    用递归实现目录删除和树形目录展示

    递归

      所谓递归(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系列视频教程。

  • 相关阅读:
    Torchkeras,一个源码不足300行的深度学习框架
    【知乎】语义分割该如何走下去?
    【SDOI2017】天才黑客(前后缀优化建图 & 最短路)
    【WC2014】紫荆花之恋(替罪羊重构点分树 & 平衡树)
    【SDOI2017】相关分析(线段树)
    【学习笔记】分治法最短路小结
    【CH 弱省互测 Round #1 】OVOO(可持久化可并堆)
    【学习笔记】K 短路问题详解
    【学习笔记】浅析平衡树套线段树 & 带插入区间K小值
    【APIO2020】交换城市(Kruskal重构树)
  • 原文地址:https://www.cnblogs.com/mengdd/p/2910139.html
Copyright © 2011-2022 走看看