寒假作业2—遍历某一路径及其子路径下的所有文件(递归和非递归两种方法)
作者:互联网
- 和寒假作业1思路一致,直接后序遍历文件树并判断其中的File对象是否是文件类型,可看作遍历文件树的叶子节点。但由于使用了递归,效率较低。
- 如果换一种方法,使用树的层次遍历(非递归,使用队列),将使效率有一定提高。
方法一:递归方法:
AllFiles类:
package com.cao.demo.allFiles;
import java.io.File;
/**
* 作者:曹浩东
* 使用递归遍历某一路径下的所有文件
*/
public class AllFiles {
private int fileCount = 0;//文件计数器
//递归遍历所有文件的方法
public void show(String path) {
File file = new File(path);//根据形参path实例化一个File对象
File[] files = file.listFiles();//返回path路径下 所有文件的File对象
//判断该目录是否为空
if (files.length > 0) {
//遍历该目录下的File对象
for (int i = 0; i < files.length; i++) {
//判断该对象是否为文件夹,如果是则递归访问
if (files[i].isDirectory()) {
show(files[i].getPath());
} else if (files[i].isFile()) {
//如果是该对象是文件,则打印。或者进行其他文件操作。
System.out.println(files[i].getPath());
//计数器加一
++fileCount;
}
}
} else {
//如果该目录为空,则打印该目录为空
System.out.println(path + "目录为空...");
}
}
//打印文件数量的方法
public void count() {
if (fileCount != 0) {
System.out.println("共扫描了" + fileCount + "个文件...");
} else {
System.out.println("还未进行遍历...");
}
}
}
Test类:
package com.cao.demo.allFiles;
public class Test {
public static void main(String[] args) {
//用于计时
long start;
long end;
//开始时间
start = System.currentTimeMillis();
//实例化AllFiles对象
AllFiles allFiles = new AllFiles();
//传入path参数
allFiles.show("C:\iweb\root");
//打印文件数量
allFiles.count();
//结束时间
end = System.currentTimeMillis();
//输出程序耗时
System.out.println("耗时" + ((end - start) / 1000.000D) + "秒...");
}
}
结果:
方法二:队列(层次遍历)
allFiles类:
package com.cao.demo.allFiles2;
import java.io.File;
/**
* 作者:曹浩东
* 使用队列遍历某一路径下的所有文件
*/
public class AllFiles {
private int fileCount = 0;//计数器
public void show(String path) {
//根据形参path实例化一个File对象
File file = new File(path);
//创建File类型的队列
File[] Queue = new File[100000];
//队头和队尾
int front = -1, rear = -1;
//入队
Queue[++front] = file;
//当队列不为空时循环
while (front != rear) {
//出队
File fileInQueue = Queue[++rear];
//判断出队的对象是否是文件
if (fileInQueue.isFile()) {
//是文件则打印。或者执行其他文件操作
System.out.println(fileInQueue.getPath());
//计数器加一
++fileCount;
} else {
//如果出队的对象是文件夹类型,则返回其下所有文件的File对象
File[] fileIn = new File(fileInQueue.getPath()).listFiles();
//依次入队
for (int i = 0; i < fileIn.length; i++) {
Queue[++front] = fileIn[i];
}
}
}
}
//打印文件数量的方法
public void count() {
if (fileCount != 0) {
System.out.println("共扫描了" + fileCount + "个文件...");
} else {
System.out.println("还未进行遍历...");
}
}
}
结果:
下表为两种方法遍历同一个含有8296个文件的文件夹所花费的时间。
递归(后序遍历) | 队列(层次遍历) |
---|---|
3.041秒 | 2.168秒 |
虽然效率提高的程度没有我想象中的大,但方法二还是比方法一提高了约30%的效率
标签:文件,遍历,递归,路径,System,寒假作业,File,println,path 来源: https://blog.csdn.net/qq_44371305/article/details/113653556