zoukankan      html  css  js  c++  java
  • 代码行数统计工具

    import java.io.*;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    /**
     * Created with IntelliJ IDEA.
     * User: 焦一平
     * Date: 2015/6/3
     * Time: 15:56
     * To change this template use File | Settings | File Templates.
     */
    public class CountLineNumber {
        static long commentLine = 0;
        static long whiteLine = 0;
        static long normalLine = 0;
        static long totalLine = 0;
        static boolean comment = false;
    
        public static void main(String[] args) {
            File file = new File("D:\工作\PDS\trunk\sourcecode\service\pns"); // 在这里输入需要统计的文件夹路径
            countLine(file);
            System.out.println("有效代码行数: " + normalLine);
            System.out.println("注释行数: " + commentLine);
            System.out.println("空白行数: " + whiteLine);
            System.out.println("总代码行数: " + totalLine);
        }
    
        /**
         * 递归统计代码行数
         *
         * @param child
         */
        private static void countLine(File child) { // 遍历子目录
            if (child.getName().matches(".*\.java$") || child.getName().matches(".*\.xml$") || child.getName().matches(".*\.properties") || child.getName().matches(".*\.json")) { // 只查询java文件
                try {
                    BufferedReader br = new BufferedReader(new FileReader(child));
                    String line = "";
                    while ((line = br.readLine()) != null) {
                        parse(line);
                    }
                } catch (FileNotFoundException e1) {
                    e1.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (child.listFiles() != null) {
                for (File f : child.listFiles()) {
                    countLine(f);
                }
            }
        }
    
        private static void parse(String line) {
            line = line.trim();
            totalLine++;
            if (line.length() == 0) {
                whiteLine++;
            } else if (comment) {
                commentLine++;
                if (line.endsWith("*/")) {
                    comment = false;
                } else if (line.matches(".*\*/.+")) {
                    normalLine++;
                    comment = false;
                }
            } else if (line.startsWith("//")) {
                commentLine++;
            } else if (line.matches(".+//.*")) {
                commentLine++;
                normalLine++;
            } else if (line.startsWith("/*") && line.matches(".+\*/.+")) {
                commentLine++;
                normalLine++;
                if (isComment(line)) {
                    comment = false;
                } else {
                    comment = true;
                }
            } else if (line.startsWith("/*") && !line.endsWith("*/")) {
                commentLine++;
                comment = true;
            } else if (line.startsWith("/*") && line.endsWith("*/")) {
                commentLine++;
                comment = false;
            } else if (line.matches(".+/\*.*") && !line.endsWith("*/")) {
                commentLine++;
                normalLine++;
                if (isComment(line)) {
                    comment = false;
                } else {
                    comment = true;
                }
            } else if (line.matches(".+/\*.*") && line.endsWith("*/")) {
                commentLine++;
                normalLine++;
                comment = false;
            } else {
                normalLine++;
            }
        }
    
        private static boolean isComment(String line) { // 查找一行中/*与*/是否成对出现
            int count1 = 0;
            int count2 = 0;
            Pattern p = Pattern.compile("/\*");
            Matcher m = p.matcher(line);
            while (m.find()) {
                count1++;
            }
            p = Pattern.compile("\*/");
            m = p.matcher(line);
            while (m.find()) {
                count2++;
            }
            return (count1 == count2);
        }
    
    }
  • 相关阅读:
    pytest
    pytest 跳过测试用例 skip
    pytest
    pytest -allure标记用例级别severity
    pytest-
    pytest-分布式执行(pytest-xdist)
    4、win10搭建easy-mock平台
    pandas日期缺失,空值填充方法
    Pandas拼接操作(concat,merge,join和append)的区别
    关于docker容器和镜像的区别
  • 原文地址:https://www.cnblogs.com/jiaoyiping/p/4634593.html
Copyright © 2011-2022 走看看