统计行代码量

java实现的。

本来想找一个,结果好费劲又得安装Python又得安装库的,还不如自己实现,恰好最近在解析超级复杂的.c文件,统计个行数简直是小case。

注释只考虑了以下3种,大概率也够用了:

//xxx  /*xxx*/  /** * xxx */  <!--xxx-->  //忘记考虑了html中的注释,算啦,以后再说,不大重要 

效果:

----------------------------------------------------------------------------------------   Language            files     sumLines  blank     comment   code       code/sumLines ----------------------------------------------------------------------------------------   JAVA                103       10663     1597      1309      7757       72.75%   JSP                 2         8         2         0         6          75.00%   HTML                52        11566     1398      20        10148      87.74%   JS                  390       225696    36322     6288      183086     81.12%   CSS                 80        46068     5474      600       39994      86.82% ----------------------------------------------------------------------------------------   SUM                 627       294001    44793     8217      240991     81.97% ---------------------------------------------------------------------------------------- 

代码:

package com.example.java_practise.统计代码量工具;  import java.io.*; import java.util.ArrayList; import java.util.List;  public class CodeLines {     public static void main(String[] args) {         String root = D:\\java\\ideaProjects\\dynamic_validate;         CodeLines o = new CodeLines();         o.printCodeLines(root);     }      public void printCodeLines(String filePath) {          String type1 = (.*\\.java$);         String type2 = (.*\\.jsp$);         String type3 = (.*\\.html$);         String type4 = (.*\\.js$);         String type5 = (.*\\.css$);         //String type6 = (.*); // 全部文件数          //File root = new File(filePath);         //List<String> filePaths = new ArrayList<String>();         //int sumFiles = listAll(root, filePaths, type6).size();          int[] r1 = readByType(filePath, type1);         int[] r2 = readByType(filePath, type2);         int[] r3 = readByType(filePath, type3);         int[] r4 = readByType(filePath, type4);         int[] r5 = readByType(filePath, type5);         int[] sums = new int[4];         for (int j = 0; j < 4; j++) {             sums[j] = r1[j] + r2[j] + r3[j] + r4[j] + r5[j];         }          System.out.println(----------------------------------------------------------------------------------------);         System.out.printf(  %-20s%-10s%-10s%-10s%-10s%-10s%14s\n, Language, files, sumLines, blank, comment, code, code/sumLines);         System.out.println(----------------------------------------------------------------------------------------);         int s = r1[4] + r2[4] + r3[4] + r4[4] + r5[4];          System.out.printf(  %-20s%-10d%-10d%-10d%-10d%-10d%6.2f%%\n, JAVA, r1[0], r1[4], r1[1], r1[2], r1[3], r1[3] * 100.0 / r1[4]);         System.out.printf(  %-20s%-10d%-10d%-10d%-10d%-10d%6.2f%%\n, JSP, r2[0], r2[4], r2[1], r2[2], r2[3], r2[3] * 100.0 / r2[4]);         System.out.printf(  %-20s%-10d%-10d%-10d%-10d%-10d%6.2f%%\n, HTML, r3[0], r3[4], r3[1], r3[2], r3[3], r3[3] * 100.0 / r3[4]);         System.out.printf(  %-20s%-10d%-10d%-10d%-10d%-10d%6.2f%%\n, JS, r4[0], r4[4], r4[1], r4[2], r4[3], r4[3] * 100.0 / r4[4]);         System.out.printf(  %-20s%-10d%-10d%-10d%-10d%-10d%6.2f%%\n, CSS, r5[0], r5[4], r5[1], r5[2], r5[3], r5[3] * 100.0 / r5[4]);         System.out.println(----------------------------------------------------------------------------------------);         System.out.printf(  %-20s%-10d%-10d%-10d%-10d%-10d%6.2f%%\n, SUM, sums[0], s, sums[1], sums[2], sums[3], sums[3] * 100.0 / s);         System.out.println(----------------------------------------------------------------------------------------);      }      private int[] readByType(String filePath, String type) {         File root = new File(filePath);         List<String> filePaths = new ArrayList<String>();         filePaths = listAll(root, filePaths, type);         int codeLine = 0;         int commentLine = 0;         int blankLine = 0;         for (String fp : filePaths) {             int[] re = readOneFile(fp);             System.out.println(当前文件 + fp);             System.out.println(代码行数: + re[0]);             System.out.println(注释行数: + re[1]);             System.out.println(空行数: + re[2]);             codeLine += re[0];             commentLine += re[1];             blankLine += re[2];         }         int files = filePaths.size();         int sum = codeLine + commentLine + blankLine;         int[] re = {files, blankLine, commentLine, codeLine, sum};         return re;     }      public int[] readOneFile(String filePath) {         try {             String encoding = UTF-8;              File file = new File(filePath);             int codeLine = 0;             int commentLine = 0;             int blankLine = 0;              if (file.isFile() && file.exists()) { //判断文件是否存在                 InputStreamReader read = new InputStreamReader(                         new FileInputStream(file), encoding);//考虑到编码格式                 BufferedReader bufferedReader = new BufferedReader(read);                  String lineTxt = null;                 while ((lineTxt = bufferedReader.readLine()) != null) {                     lineTxt = lineTxt.trim();                     if (lineTxt.equals()) {                         blankLine++;                     } else if (lineTxt.matches((^\\s*/{2}.*)|(^\\s*/?\\*.*))) { // 匹配 1 以任意空格+//或/或*开头的行,就是/**/和//注释 2 以*/结尾的                         if (lineTxt.matches((^\\s*/\\*.*)) && !lineTxt.matches((.*\\*/\\s*$))) { // 以/*开头 却不以*/结尾。                             while ((lineTxt = bufferedReader.readLine()) != null) {                                 commentLine++;                                 if (lineTxt.matches((.*\\*/\\s*$))) { // 以*/结束                                     commentLine++;                                     break;                                 }                             }                         }                     } else {                         codeLine++;                     }                 }                 read.close();                  int[] re = {codeLine, commentLine, blankLine};                 return re;             } else {                 System.out.println(找不到指定的文件);                 return null;             }         } catch (Exception e) {             System.out.println(读取文件内容出错);             e.printStackTrace();             return null;         }     }       private List<String> listAll(File root, List<String> filePaths, String reg) {         if (root.exists()) {             File[] files = root.listFiles();             if (files != null && files.length > 0) {                 for (int i = 0; i < files.length; i++) {                     if (files[i].exists() && files[i].isDirectory()) {                         listAll(files[i], filePaths, reg);                     } else {                         String path = files[i].getAbsolutePath();                         if (path.matches(reg)) {                             filePaths.add(path);                         }                     }                 }             }         }         return filePaths;     } }