Java查询目录下的所有文件(包括子目录)--修改版
程序员文章站
2022-06-16 12:39:42
...
原来的查询方法参考我另一篇博客:https://blog.csdn.net/DGH2430284817/article/details/86480831
但是其中有一些缺陷,如方法的参数在方法的执行中没有用另外的引用来接收数据,这样是不符合java编程规范的
修改后:
public static List<String> findFileList2(File dir) {
List<String> temp = new ArrayList<String>();
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<String> fileNames2 = new ArrayList<String>();
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<String> findFileList3(File dir) {
List<String> fileNames = new ArrayList<String>();
Queue<String> queue = new LinkedList<String>();
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<String> fileNames3 = new ArrayList<String>();
fileNames3 = ReadFileUtil.findFileList3(new File("E:\\work\\workspaces\\ScztPoin2") );
System.out.println("完成用时(ms):"+(System.currentTimeMillis()-startTime3));
System.out.println("文件数:" + fileNames3.size());
测试结果:
完成用时(ms):8228
文件数:9962