美文网首页
代码注释统计,计算代码注释率

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

作者: 小马将过河 | 来源:发表于2021-03-08 17:29 被阅读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覆盖率收集生成多模块聚合报告

    相关文章

      网友评论

          本文标题:代码注释统计,计算代码注释率

          本文链接:https://www.haomeiwen.com/subject/cozpqltx.html