使用java递归来遍历给定路径下的文件,并有缩进效果

刚学到递归,做一个练习,如有更好的方法或有错误,欢迎指正

利用File类中的一个listFiles();方法将该文件路径下所有的文件全部列出来,然后通过循环遍历。

  1. 首先介绍一下File类中的listFiles方法,该方法将会把File路径下一级目录中的文件和文件夹遍历出来,并且将返回一个File类型的数组,数组里的每一项就是一个File对象,分别对应目录中的一个个文件和文件夹的路径。
  2. 然后介绍一下递归,递归则可以理解成不达目的誓不罢休的情况,方法通过自己调用自己,来达到“至死方休”的效果,这就需要考虑,什么时候让他“死”,也就是什么时候终止自己调用自己,就本题而言,如果File对象是一个文件,则输出File对象的Name,此时终止该文件的递归(如果File对象是一个文件夹,则继续再遍历其内部的文件和文件夹,循环往复)

文件结构

代码如下:

public class TestOfRecusion1 {
    static StringBuilder sb=new StringBuilder(" ");
    public static void main(String[] args) {
    //我自己在项目的根目录下,定义了一个dir1文件夹,并在其中创建了几个文件夹和文件
        File file=new File("dir1");
        //首先打印一下当前的文件夹名称(dir)
        System.out.println(file.getName());
        //调用递归方法test
        test(file);
    }
    //定义递归方法test
    static void test(File file){
    //调用参数中File对象的listFiles()方法
    //则files数组中将会包含a,b,新建DOC文档.doc,这三个所对应的File对象
        File [] files=file.listFiles();
        //遍历一下files中的File对象,挨个判断一下
        for (File file1 : files) {
        //如果是文件夹,则先将StringBuiler加一个空格,然后修改后的StringBuilder+File的名字打印出来(用这种方法实现一个类似于文件位置的缩进效果,便于查看文件的所属关系)
            if (file1.isDirectory()){
                sb.append(" ");
                System.out.println(sb+file1.getName());
                //由于是一个文件夹,所以要再遍历其内部,也就是再调用一下test方法(同样,如果其内部还有文件夹,则再遍历)
                test(file1);
                //注意,每结束一次递归,一定要将StringBuiler减去一个空格,下面说明一下这样做的原因
                //首先我们在子文件夹中检索到一个文件或文件夹后,就会在原来的基础上加上一个空格,
                //如果是一个文件夹,则其内部的文件还要再加上一个空格,当输出以后,也就是这个路径下的文件都遍历完了,已经没有文件夹了,可以遍历下一个路径了
                //此时我们要减去一个空格(本人语言表达能力有限,望体谅,不过我感觉这个题目的重点就是缩进的控制)
                sb.delete(0,1);
            }else {
            //如果一开始判断是一个文件,则StringBuilder+空格,输出,并最后减去一个空格
                sb.append(" ");
                System.out.println(sb+file1.getName());
                sb.delete(0,1);
            }
        }
    }
}

运行结果如下:
运行结果
dir1文件夹中有a文件夹,b文件夹,和一个文件。a文件夹中有两个文件,b文件夹中有c文件夹,c文件夹中有一个文件

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值