Java学习-递归打印目录树状结构

    int tab = 0;
    public boolean printList(File file){

/*
 *       要做到输入的有格式化即有明显的缩进,
 *       第一个要明确的就是要将所有的步骤简化为一个动作,这个和循环单纯的递归不一样的地方就是循环只是重复一个动作,
 *       但是,这个地方如果只是单纯的循环或者是递归不能满足要求,这个地方必须要加入一个统计量,统计需要打印多少的tab数量,
 *       因为你不知道你的文件夹中有多少的文件或者是有多少的文件夹还需要分解,单纯的循环做不到
 *       所以在做的过程中,先把整体的框架写好,先不考虑打印多少的tab,那么就是简单的递归函数,
 *       我的思路就是不管是文件还是文件夹,首先先打印出来,这样的话,就可以不用考虑会不会漏打空文件夹,而且这样的代码比较简单,
 *       在打印完成之后就可以考虑怎么进行缩进,或者是说怎么找到需要缩进的条件,很明显的就是,
 *       子目录或者是说一个文件夹进行分解为子文件或者是子文件夹,这个时候才需要缩进,
 *       那么也就是说,在打印的时候,就必须要tab这个统计量加上一个一,
 *       这样在打印的时候,直接用for就可以了,那么也推出来,在打印的时候文件夹或者是文件名字的时候如果要缩进的话,
 *       就是需要用for打印tab个"\t",直接用条件即可,当然这只是对于简单的文件目录来说,可以使用,但是,
 *       有多层文件结构的时候缩进就会变错,就像上面的注释代码一样,缩进格式会变错,
 *       这个是因为,没有注意到每次重新调用的时候,都会初始化为0,所以无论如何,都不可能打印完美的缩进,
 *       那么我们就需要可以统计的变量,这个变量不能定义在函数里面,否则每次都会初始化那么 就不可能统计数量,
 *       所以必须要全局变量或者是静态变量,这些变量才可以不受一个函数被重新调用的时候的影响,顺便复习的就是静态代码块的作用
 *       所有的对象都共用一个静态代码块,而且只执行一次
 *       这样的话在调用函数自身的时候,可以让tab自增一,用for的条件就可以实现控制子目录中的缩进增加一了。
 *
 *
 *       但是特别注意的,也是我自己做了很多便才发现的,在调用了这个递归之前,如果统计数每次都加上一,
 *       那么当回到第一次的地方时,各种缩进已经完全乱了,所以最简单的方式就是复位,也就是,每次调用完成之后减去一就可以了
 *       我觉得这是我最大的思想转变,以前只做不考虑结果,现在特别是递归,要用到这些的时候,就会发现,原来递归真的是大佬
 *
 *
 *
 *
 *       首先不管是文件还是文件夹都是打印出来,注意打印多少的缩进,用for
 *
 */
        for(int i=0;i<tab;i++)
            System.out.print("\t");
        System.out.println(file.getName());
//        判断是不是文件
        if(file.isFile())
            ;
        else{
//            文件的反面就是文件夹,那么就开始分解文件夹
            File[] arrayFiles = file.listFiles();
//            文件夹分解之后就会有一个数组的File对象,这些对象每一个重新进入这个函数去打印去判断
            for(int i=0; i<arrayFiles.length; i++){
//                既然要用调用递归函数,那么就是子目录的文件或者是文件夹了,打印的时候要加一
                ++tab;
                this.printList(arrayFiles[i]);
//                当调用完成了之后,就要减掉这个自增的一,都则当当打印到最后的时候,已经不是正确的缩进了
                --tab;
            }
        }
        return true;
    }

示例

评论区


2 条评论

  1. HelloHello 访问者
    2020年12月15日

    Hello


  2. HelloHello 访问者
    2020年12月15日

    Hi,你好世界