欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

 

相关标签: java查询目录文件