代码注释统计,计算代码注释率
2021-03-08 本文已影响0人
小马将过河
因为客户要求代码注释率达到25%,咱也不懂以什么算,估计是行数吧。本地搭个sonarqube也太麻烦了。
于是从网上抄了了个main函数,发现能实现这个目标。
贴出来备忘。
package com.hczt.cosmotestweb.component;
import java.io.*;
import java.util.ArrayList;
/**
* 精诚所至,金石为开。
* 石の上にも三年;陽気の発する所金石亦透る。
*
* @Author mahaiqiang
* @Create 2021/3/8 10:19 上午
* @Desc TODO
**/
public class CodeCounter {
static long codeLines = 0;
static long commentLines = 0;
static long blankLines = 0;
static ArrayList<File> fileArray = new ArrayList<File>();
public static void main(String[] args) {
//可以统计指定目录下以及其子目录下的所有java文件中代码
File file = new File("/Users/mahaiqiang/git/redcreation/cosmo-test-platform/cosmo-test-api/");
ArrayList<File> al = getFile(file);
for (File f : al) {
if (f.getName().matches(".*\\.java$"))
count(f);
// if (f.getName().matches(".*\\.xml$"))
// count(f);
// if (f.getName().matches(".*\\.sql$"))
// count(f);
// if (f.getName().matches(".*\\.properties$"))
// count(f);
// if (f.getName().matches(".*\\.jsp$"))
// count(f);
// if (f.getName().matches(".*\\.js$"))
// count(f);
// if (f.getName().matches(".*\\.css$"))
// count(f);
// if (f.getName().matches(".*\\.vue$"))
// count(f);
}
System.out.println("代码行数:" + codeLines);
System.out.println("注释行数:" + commentLines);
System.out.println("空白行数: " + blankLines);
}
// 获得目录下的文件和子目录下的文件
public static ArrayList<File> getFile(File f) {
File[] ff = f.listFiles();
for (File child : ff) {
if (child.isDirectory()) {
getFile(child);
} else
fileArray.add(child);
}
return fileArray;
}
// 统计方法
private static void count(File f) {
BufferedReader br = null;
boolean flag = false;
boolean flag2 = false;
try {
br = new BufferedReader(new FileReader(f));
String line = "";
while ((line = br.readLine()) != null) {
line = line.trim(); // 除去注释前的空格
if (line.matches("^[ ]*$")) { // 匹配空行
blankLines++;
} else if (line.startsWith("//")) { //这种注释块我不需要算作注释,而且也不需要算为代码行
commentLines++;
} else if (line.startsWith("/**")||line.startsWith("/*!")) { //只计算这种形式的注释块
commentLines++;
flag = true;
if (line.endsWith("*/")) {
flag = false;
}
} else if (flag == true) {
commentLines++;
if (line.endsWith("*/")) {
flag = false;
}
} else if (line.startsWith("/*")) { //只计算这种形式的注释块
flag2 = true;
if (line.endsWith("*/")) {
flag2 = false;
}
} else if (flag2 == true) {
if (line.endsWith("*/")) {
flag2 = false;
}
} else {
codeLines++;
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
br = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
运行main以后
1.0.3.jar:/Users/mahaiqiang/.m2/repository/org/apache/commons/commons-pool2/2.6.1/commons-pool2-2.6.1.jar com.hczt.cosmotestweb.component.CodeCounter
代码行数:26883
注释行数:6753
空白行数: 5072
Process finished with exit code 0
完美。