刚学到递归,做一个练习,如有更好的方法或有错误,欢迎指正
利用File类中的一个listFiles();方法将该文件路径下所有的文件全部列出来,然后通过循环遍历。
- 首先介绍一下File类中的listFiles方法,该方法将会把File路径下一级目录中的文件和文件夹遍历出来,并且将返回一个File类型的数组,数组里的每一项就是一个File对象,分别对应目录中的一个个文件和文件夹的路径。
- 然后介绍一下递归,递归则可以理解成不达目的誓不罢休的情况,方法通过自己调用自己,来达到“至死方休”的效果,这就需要考虑,什么时候让他“死”,也就是什么时候终止自己调用自己,就本题而言,如果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文件夹中有一个文件