• 代码行数统计工具


    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);
        }
    
    }
  • 相关阅读:
    C++(OI竞赛入门)学习指南一
    faster-rcnn错误信息 : tensorflow.python.framework.errors_impl.InvalidArgumentError: Assign requires shapes of both tensors to match. lhs shape= [21] rhs shape= [2]
    ssd训练之bug:Invalid JPEG data or crop window, data size 565248
    coco数据集标注图转为二值图python(附代码)
    静态变量和全局变量的区别
    Tortoisegit常见错误Disconnected no supported authentication methods available(server sent: publickey)
    zookeeper启动为什么占用8080端口,修改哪个配置文件可以改变端口?
    安装Dubbo 并且安装注册中心(Zookeeper-3.3.6)
    Zookeeper基础命令操作
    maven环境变量配置不成功的原因
  • 原文地址:https://www.cnblogs.com/jiaoyiping/p/4634593.html
Copyright © 2020-2023  润新知