Java查询目录下的所有文件(包括子目录)--修改版

版权声明:本文为博主原创文章,如需转载请标明出处。 https://blog.csdn.net/DGH2430284817/article/details/87920079

原来的查询方法参考我另一篇博客: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

猜你喜欢

转载自blog.csdn.net/DGH2430284817/article/details/87920079