之前写东西的时候一直使用递归的方式去遍历文件夹下所有文件,因为它写起来和看起来都非常的精简易读,一般情况下是可以用的。
但今天我要复制一个文件夹,此文件夹下有一百多万个小文件,这下可好了,时间耗费了很多,而且内存直蹦2G以上,很容易导致堆栈溢出。所以就找找了非递归遍历方法,如下:
import java.io.*;
import java.util.LinkedList;
public class LoopDir {
public static void main(String[] args) {
long count=0;
long countd=0;
//链表
LinkedList<File> list = new LinkedList<File>();
File dir = new File("D://");
File[] file = dir.listFiles();
for (int i = 0; i < file.length; i++) {
if (file[i].isDirectory())
//把第一层的目录,全部放入链表
list.add(file[i]);
else
count++;
System.out.println("文件"+count + ":" + file[i].getAbsolutePath());
}
File tmp=null;
//循环遍历链表
while (!list.isEmpty()) {
//把链表的第一个记录删除
tmp = list.removeFirst();
//如果删除的目录是一个路径的话
if (tmp.isDirectory()) {
//列出这个目录下的文件到数组中
file = tmp.listFiles();
if (file == null)
continue;
//遍历文件数组
for (int i = 0; i < file.length; i++) {
if (file[i].isDirectory())
//如果遍历到的是目录,则继续加入链表
list.add(file[i]);
else
count++;
System.out.println("文件"+count + ":" + file[i].getAbsolutePath());
}
} else {
countd++;
System.out.println("目录["+countd+"]路径:" +tmp.getAbsolutePath());
}
}
}
}