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);
        }
    
    }
  • 相关阅读:
    Error resolving template,template might not exist or might not be accessible by any of the configured Template Resolvers
    springboot中参数校验
    springboot中参数处理
    springboot整合thymeleaf手动渲染
    java.sql.SQLException: validateConnection false
    Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure either the serv
    springboot项目中使用设计模式一策略模式
    ubuntu18.04系统桌面很卡 换回16.04桌面
    C++中void和void*指针的含义 (指针类型的含义)
    c++ 派生类的构造函数 与 基类构造函数的关系
  • 原文地址:https://www.cnblogs.com/jiaoyiping/p/4634593.html
Copyright © 2011-2022 走看看