代码注释统计,计算代码注释率

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

完美。

推荐:
java代码实现单元测试jacoco覆盖率收集生成多模块聚合报告

上一篇下一篇

猜你喜欢

热点阅读