FileStatManager.java 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package J20250804.demo01;
  2. import java.io.BufferedWriter;
  3. import java.io.File;
  4. import java.io.FileWriter;
  5. import java.io.IOException;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. import java.util.Locale;
  9. import java.util.concurrent.ExecutionException;
  10. import java.util.concurrent.ExecutorService;
  11. import java.util.concurrent.Executors;
  12. import java.util.concurrent.Future;
  13. /**
  14. * @author WanJl
  15. * @version 1.0
  16. * @title FileStatManager
  17. * @description
  18. * @create 2025/8/4
  19. */
  20. public class FileStatManager {
  21. //文件夹路径
  22. private String directoryPath;
  23. //返回的集合列表
  24. private List<FileStat> results;
  25. public FileStatManager(String directoryPath) {
  26. this.directoryPath = directoryPath;
  27. this.results = new ArrayList<>();
  28. }
  29. /**
  30. * 递归查找文件夹下面的所有的(java)文件
  31. * @param directory 文件夹路径
  32. * @return
  33. */
  34. private List<File> findAllJavaFiles(File directory){
  35. //1、创建存所有文件的File对象的集合,
  36. List<File> javaFiles=new ArrayList<>();
  37. //获取参数directory文件夹里的所有文件和文件夹组成的数组
  38. File[] files = directory.listFiles();
  39. //2、判断当前的文件夹中有没有文件或文件夹
  40. if (files==null){
  41. //如果都没有,就把集合返回给调用者
  42. return javaFiles;
  43. }
  44. //3、如果有,就展开文件夹,获取到里面的每一个文件或文件夹
  45. for (File file: files){
  46. //5、如果这个File对象,是文件夹,那么调用方法自身,再跳回到第2步,再次执行一轮
  47. if (file.isDirectory()){
  48. //那就再使用findAllJavaFiles()操作文件夹,并且把结果添加到集合
  49. javaFiles.addAll(findAllJavaFiles(file));
  50. }else if(file.getName().toLowerCase().endsWith(".java")){//4、如果这个File是一个文件,那么就放入集合。
  51. //我们只处理.java文件
  52. javaFiles.add(file);
  53. }
  54. }
  55. //6最终返回的是一个集合,集合里面全是Java文件File对象
  56. return javaFiles;
  57. }
  58. /**
  59. * 开始统计文件
  60. */
  61. public void startStatistics() throws IOException, ExecutionException, InterruptedException {
  62. File directory =new File(directoryPath);
  63. if (!directory.exists()||!directory.isDirectory()){
  64. throw new IOException("文件夹不存在或者不是一个文件夹:"+directoryPath);
  65. }
  66. //获取所有的java文件
  67. List<File> javaFiles=findAllJavaFiles(directory);
  68. //判空
  69. if (javaFiles.isEmpty()){
  70. System.out.println("没有任何.java文件");
  71. return;
  72. }
  73. //创建线程池,线程池
  74. //假如你也不知道需要放多大的核心线程数,可以让程序自己计算,计算系统CPU的核心数是多少--邪修 不是正道
  75. int i = Runtime.getRuntime().availableProcessors();
  76. ExecutorService executorService = Executors.newFixedThreadPool(i);
  77. //提交所有任务
  78. List<Future<FileStat>> futureList=new ArrayList<>();
  79. //变量存有所有Java文件的集合
  80. for (File file:javaFiles){
  81. //提交的任务存入List集合
  82. futureList.add(
  83. //向线程池中提交一个任务
  84. executorService.submit(new FileStatTask(file))
  85. );
  86. }
  87. //再遍历任务集合
  88. for (Future<FileStat> future:futureList){
  89. //获取每个任务执行的结果,返回值存入到results集合
  90. results.add(future.get());
  91. }
  92. executorService.shutdown();
  93. }
  94. /**
  95. * 把统计结果写入到文件
  96. */
  97. public void writeResultsToFile(String outputPath) throws IOException {
  98. BufferedWriter bw=new BufferedWriter(new FileWriter(outputPath));
  99. for (FileStat fileStat: results){
  100. bw.write(fileStat.toString());
  101. bw.newLine();
  102. bw.flush();
  103. }
  104. bw.close();
  105. }
  106. public List<FileStat> getResults() {
  107. return results;
  108. }
  109. }