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

java遍历目录-Java遍历文件夹-递归多线程实现最大速度遍历目录

程序员文章站 2022-07-10 17:50:55
递归多线程实现最大速度遍历一个目录启动方法(PS:调用这个方法就可以了)工具类(PS:直接粘贴就可以)启动方法(PS:调用这个方法就可以了)/** * 获取某个目录下所有文件名,以文件夹分组 * * @param pathStr * @return */public static List getAllFilePathGroupFolder(String pathStr) {System.out.println("开始扫描:"+ pathStr);...

启动方法(PS:调用这个方法就可以了)

	/**
	 * 获取某个目录下所有文件名,以文件夹分组
	 * 
	 * @param pathStr
	 * @return
	 */
	public static List<Map> getAllFilePathGroupFolder(String pathStr) {
		System.out.println("开始扫描:"+ pathStr);
		Long nowTime = new Date().getTime();
		String str = pathStr;
		ScanFolderToFolderMap a = new ScanFolderToFolderMap(str);
		FutureTask<List<Map>> b = new FutureTask<List<Map>>(a);
		Thread worker = new Thread(b,str);
		worker.start();
		List<Map> c = null;
		try {
			c = b.get();
		} catch (Exception e) {
			e.printStackTrace();
			c = new ArrayList();
		}
		System.out.println("全部扫描结束,共扫描文件夹:" + c.size() + ",用时" + (new Date().getTime() - nowTime));
		return c;
	}
	

工具类(PS:直接粘贴就可以)


import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

public class ScanFolderToFolderMap implements Callable<List<Map>>{
	
	//存储当前线程数量
	private static Integer sumJob = 0 ;
	
	private String folderPath = "";
	
	/**
	 * 初始化一个线程
	 * @param folderPath
	 */
	public ScanFolderToFolderMap(String folderPath){
		this.folderPath = folderPath;
	}
	
	
	/**
	 * 线程执行内容
	 */
	
	public List<Map> call() throws Exception {
		sumJob++;
		Long nowTime = new Date().getTime();

		
		//准备返回的路径
		List<Map> reArr = new ArrayList<Map>();
		
		//获取路径
		// 校验路径是否有问题
		try {
			File file = new File(folderPath);
			if ((!file.isDirectory()) && (!file.isFile())) {
				return null;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		
		// 该目录下所有文件
		List<String> reFileArr = new ArrayList<String>();

		// 获取路径
		File file = new File(folderPath);

		// 获取文件夹内容以及判断是否有权限
		File[] sonFileArr = file.listFiles();
		if (sonFileArr == null){
			System.out.println("无权限");
			return null;
		}
		
		//准备子线程列表
		List<FutureTask<List<Map>>> workList = new ArrayList<FutureTask<List<Map>>>();
		
		//判断是否有子文件夹
		for(File fileObj:sonFileArr){
			if(fileObj.isFile()){
				//文件就添加路径
				reFileArr.add(fileObj.getAbsolutePath());
			}else{
				if(sumJob >= 10){
					try {
						//等带当前线程处理
						Thread.currentThread().sleep(sumJob*100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				
				
				//文件夹就继续解析			
				ScanFolderToFolderMap a = new ScanFolderToFolderMap(fileObj.getAbsolutePath());
				FutureTask<List<Map>> b = new FutureTask<List<Map>>(a);
				workList.add(b);
				Thread worker = new Thread(b,fileObj.getAbsolutePath());
				worker.start();
			}
		}
		
		//获取所有线程返回信息
		for(FutureTask<List<Map>> workObj:workList){
			try {
				List<Map> mapArr = workObj.get();
				if (mapArr != null) {
					reArr.addAll(mapArr);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
		if (reFileArr.size() != 0) {
			Map fileMap = new HashMap();
			fileMap.put("folderName", file.getName());
			fileMap.put("folderPath", folderPath);
            Collections.sort(reFileArr);//对list集合进行排序
			fileMap.put("folderFiles", reFileArr);
			fileMap.put("date",file.lastModified());
			reArr.add(fileMap);
		}
		
		//返回扫描结果
		System.out.println((sumJob--) + ":扫描 " + folderPath + " 结束,用时" + (new Date().getTime() - nowTime));
		return reArr;
	}
	
}

本文地址:https://blog.csdn.net/weixin_42340354/article/details/109640118

相关标签: JAVA 多线程