package com.cdkj.project.syn.common;/*** @author YUFEI* @ClassName SearchFiles* @description: TODO* @date 2023年05月18日* @version: 1.0*/import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.RecursiveTask;/*** 搜索指定文件信息* @author: alex* @Date: 2019/3/20 9:52* @Description: 演示RecursiveTask的用法,将大事件拆分成若干个小任务去执行,执行完成后使用ForkJoinPool,合并结果集* 场景描述:搜索指定文件名,获得该文件名所在的目录。* 将每一层的文件夹都当做一个子任务进行拆分,寻找每个子文件夹中的内容,最后合并结果集。*/ public class SearchFiles extends RecursiveTask<String> {private File path;private String searchFileName;/*** 构造方法* @param path 文件信息* @param searchFileName 目标文件名字*/public SearchFiles(File path, String searchFileName) {this.path = path;this.searchFileName = searchFileName;}/*** 重新compute方法* @return 结果*/@Overrideprotected String compute() {String filePath = ""; //存放文件路径List<SearchFiles> subTask = new ArrayList<SearchFiles>(); //子任务集合File[] files = path.listFiles();for (File file : files) {//判断是否是文件夹,如果是,则添加到子任务集合中,不是,则判断是否是目标文件if (file.isDirectory()) {subTask.add(new SearchFiles(file, searchFileName));} else {if (file.getName().equals(searchFileName)) { //是否是目标文件filePath = file.getAbsolutePath(); //返回目标文件路径}}}//判断子任务集合是否为空if (!subTask.isEmpty()) {//通过invokeAll方法,执行所有子任务for (SearchFiles task : invokeAll(subTask)) {if (!task.join().isEmpty()) {filePath = filePath + task.join() + ",";}}}return filePath;}/*** 搜索目标文件* @param path 文件路径* @param fileName 目标文件名称* @return 目标文件路径集合*/public static List<String> searchFileByName(String path, String fileName) {ForkJoinPool forkJoinPool = new ForkJoinPool();SearchFiles findDirFiles = new SearchFiles(new File(path), fileName);//开始执行的forkJoinPool.invoke(findDirFiles);//收集结果String result = findDirFiles.join();List<String> resultList = new ArrayList<>();if (!result.isEmpty()) {for (String name : result.split(",")) {if (!name.isEmpty()) {resultList.add(name);}}}forkJoinPool.shutdown();return resultList;}} class SearchFilesTest {public static void main(String[] args) {List<String> list = SearchFiles.searchFileByName("D:\\Users\\Administrator\\eclipse-workspace\\shoujiezhe\\BorderKeeperServer", "配置.md");list.forEach(System.out::println); // for (String s : list) { // System.out.println(s); // }}}