public static List findFileList2(File dir) {
List temp = new ArrayList();
if (!dir.exists() || !dir.isDirectory()) {// 判断是否存在目录
return null;
}
String[] files = dir.list();// 读取目录下的所有目录文件信息
for (int i = 0; i < files.length; i++) {// 循环,添加文件名或回调自身
File file = new File(dir, files[i]);
if (file.isFile()) {// 如果文件
temp.add(dir + "\\" + file.getName());// 添加文件全路径名
} else {// 如果是目录
temp.addAll(findFileList2(file));// 回调自身继续查询,把得到的结果返回
}
}
return temp;
}
long startTime2 = System.currentTimeMillis();
List fileNames2 = new ArrayList();
fileNames2 = ReadFileUtil.findFileList2(new File("E:\\work\\workspaces\\ScztPoin") );
System.out.println("完成用时(ms):"+(System.currentTimeMillis()-startTime2));
System.out.println("文件数:" + fileNames2.size());
完成用时(ms):6752
文件数:9962
运用这种递归的方式查询所有文件,不断的回调自身去查询文件,会存在一个代码层级太高的问题,如果某层回调出了问题,那可能导致每一层都出问题,目录越深处问题的概率越高,所以再次修改,用while来打破这种不断回调自身的问题。
public static List findFileList3(File dir) {
List fileNames = new ArrayList();
Queue queue = new LinkedList();
queue.offer(dir.toString());
String temp = null;
while (true) {
if ((temp=queue.poll()) == null || "".equals(temp)) {
break;
}
String[] files = new File(temp).list();// 读取目录下的所有目录文件信息
for (int i = 0; i < files.length; i++) {// 循环,添加文件名或回调自身
File file = new File(temp, files[i]);
if (file.isFile()) {// 如果文件
fileNames.add(temp + "\\" + file.getName());// 添加文件全路径名
} else {// 如果是目录
queue.offer(temp + "\\" + file.getName());
}
}
}
return fileNames;
}
long startTime3 = System.currentTimeMillis();
List fileNames3 = new ArrayList();
fileNames3 = ReadFileUtil.findFileList3(new File("E:\\work\\workspaces\\ScztPoin2") );
System.out.println("完成用时(ms):"+(System.currentTimeMillis()-startTime3));
System.out.println("文件数:" + fileNames3.size());
完成用时(ms):8228
文件数:9962