123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- 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<FileStat> results;
- public FileStatManager(String directoryPath) {
- this.directoryPath = directoryPath;
- this.results = new ArrayList<>();
- }
- /**
- * 递归查找文件夹下面的所有的(java)文件
- * @param directory 文件夹路径
- * @return
- */
- private List<File> findAllJavaFiles(File directory){
- //1、创建存所有文件的File对象的集合,
- List<File> 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<File> javaFiles=findAllJavaFiles(directory);
- //判空
- if (javaFiles.isEmpty()){
- System.out.println("没有任何.java文件");
- return;
- }
- //创建线程池,线程池
- //假如你也不知道需要放多大的核心线程数,可以让程序自己计算,计算系统CPU的核心数是多少--邪修 不是正道
- int i = Runtime.getRuntime().availableProcessors();
- ExecutorService executorService = Executors.newFixedThreadPool(i);
- //提交所有任务
- List<Future<FileStat>> futureList=new ArrayList<>();
- //变量存有所有Java文件的集合
- for (File file:javaFiles){
- //提交的任务存入List集合
- futureList.add(
- //向线程池中提交一个任务
- executorService.submit(new FileStatTask(file))
- );
- }
- //再遍历任务集合
- for (Future<FileStat> 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<FileStat> getResults() {
- return results;
- }
- }
|