package J20250804.demo01; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; /** * @author WanJl * @version 1.0 * @title FileStatManager * @description * @create 2025/8/4 */ public class FileStatManager { //文件夹路径 private String directoryPath; //返回的集合列表 private List results; public FileStatManager(String directoryPath) { this.directoryPath = directoryPath; this.results = new ArrayList<>(); } /** * 递归查找文件夹下面的所有的(java)文件 * @param directory 文件夹路径 * @return */ private List findAllJavaFiles(File directory){ //1、创建存所有文件的File对象的集合, List javaFiles=new ArrayList<>(); //获取参数directory文件夹里的所有文件和文件夹组成的数组 File[] files = directory.listFiles(); //2、判断当前的文件夹中有没有文件或文件夹 if (files==null){ //如果都没有,就把集合返回给调用者 return javaFiles; } //3、如果有,就展开文件夹,获取到里面的每一个文件或文件夹 for (File file: files){ //5、如果这个File对象,是文件夹,那么调用方法自身,再跳回到第2步,再次执行一轮 if (file.isDirectory()){ //那就再使用findAllJavaFiles()操作文件夹,并且把结果添加到集合 javaFiles.addAll(findAllJavaFiles(file)); }else if(file.getName().toLowerCase().endsWith(".java")){//4、如果这个File是一个文件,那么就放入集合。 //我们只处理.java文件 javaFiles.add(file); } } //6最终返回的是一个集合,集合里面全是Java文件File对象 return javaFiles; } /** * 开始统计文件 */ public void startStatistics() throws IOException, ExecutionException, InterruptedException { File directory =new File(directoryPath); if (!directory.exists()||!directory.isDirectory()){ throw new IOException("文件夹不存在或者不是一个文件夹:"+directoryPath); } //获取所有的java文件 List javaFiles=findAllJavaFiles(directory); //判空 if (javaFiles.isEmpty()){ System.out.println("没有任何.java文件"); return; } //创建线程池,线程池 //假如你也不知道需要放多大的核心线程数,可以让程序自己计算,计算系统CPU的核心数是多少--邪修 不是正道 int i = Runtime.getRuntime().availableProcessors(); ExecutorService executorService = Executors.newFixedThreadPool(i); //提交所有任务 List> futureList=new ArrayList<>(); //变量存有所有Java文件的集合 for (File file:javaFiles){ //提交的任务存入List集合 futureList.add( //向线程池中提交一个任务 executorService.submit(new FileStatTask(file)) ); } //再遍历任务集合 for (Future future:futureList){ //获取每个任务执行的结果,返回值存入到results集合 results.add(future.get()); } executorService.shutdown(); } /** * 把统计结果写入到文件 */ public void writeResultsToFile(String outputPath) throws IOException { BufferedWriter bw=new BufferedWriter(new FileWriter(outputPath)); for (FileStat fileStat: results){ bw.write(fileStat.toString()); bw.newLine(); bw.flush(); } bw.close(); } public List getResults() { return results; } }