Java 代码行统计(转)

package codecounter;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class CodeCounter {
    static long commentLine = 0;
    static long whiteLine = 0;
    static long normalLine = 0;
    static long totalLine = 0;
    static boolean comment = false;
    static final String base_dir = "D:\\javap\\qdgs\\qdgs_gzfw\\src\\java\\qdgsgzfw";

    public static void main(String[] args) {
        File file = new File(base_dir); // 在这里输入需要统计的文件夹路径  

        getChild(file);  

        System.out.println("有效代码行数: " + normalLine);
        System.out.println("注释行数: " + commentLine);
        System.out.println("空白行数: " + whiteLine);
        System.out.println("总代码行数: " + totalLine);
    }  

    private static void getChild(File child) { // 遍历子目录
        if (child.getName().matches(".*\\.java$")) { // 只查询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()) {
                getChild(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 (findPair(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 (findPair(line)) {
                comment = false;
            } else {
                comment = true;
            }
        } else if (line.matches(".+/\\*.*") && line.endsWith("*/")) {
            commentLine++;
            normalLine++;
            comment = false;
        } else {
            normalLine++;
        }
    }  

    private static boolean findPair(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);
    }  

}
时间: 2024-10-30 00:15:24

Java 代码行统计(转)的相关文章

Java代码行统计程序

1.统计粒度 能够统计包括:代码行数.注释.空行.总行数. 2.适用的编程语言 目前只测试过Java,其它编程语言暂时未知. 3.代码简析 代码行统计需要考虑的因素包括字符串匹配.编程语言本身的字符串,后者非常重要,往往导致难以发现的bug.该程序的核心在于递归的使用和栈的构造,需要深刻理解递归的原因和栈的几种状态. 4.参考程序 程序一:http://wenku.baidu.com/view/2a3dcbe3524de518964b7dec.html 程序二:http://www.downxi

编写maven代码行统计插件

编写maven插件的步骤 创建一个maven-plugin项目:插件本身也是maven项目,只是它的packaging是maven-plugin. 为插件编写目标:每个插件必须包含一个或多个目标,maven称之为Mojo.编写插件时必须提供一个或多个继承自AbstractMojo的类. 为目标提供配置点:大部分maven插件以及其目标都是可配置的,因此在编写Mojo的时候需要注意提供可配置的参数. 编写代码,实现目标. 错误处理以及日志,为客户提供足够的信息. 测试插件 一:创建maven-pl

Git代码行统计命令集

统计某人的代码提交量,包括增加,删除: git log --author="$(git config --get user.name)" --pretty=tformat: --numstat | gawk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf "added lines: %s removed lines : %s total lines: %s\n",add,subs,loc }' -

用代码统计java代码行数

public class Tongjidaima { private static int i;//代码总行数 private static int j;//文件个数 public static void main(String[] args) throws IOException { File file = new File("F:\\eclipsework\\Zhansen");//需要统计行数的文件夹路径 traverseFiles(file);//调用递归方法查看.java文件

mac OSX下git代码行统计命令

1.统计某人的代码提交量,包括增加,删除 git log --author="$(git config --get user.name)" --since=2014-07-01 --until=2016-08-01 --pretty=tformat: --numstat | awk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf "added lines: %s removed lines : %s tota

TensorFlow 代码行统计

https://github.com/tensorflow/tensorflow.git

Python实现代码行数统计工具

我们经常想要统计项目的代码行数,但是如果想统计功能比较完善可能就不是那么简单了, 今天我们来看一下如何用python来实现一个代码行统计工具. 思路:首先获取所有文件,然后统计每个文件中代码的行数,最后将行数相加. 实现的功能: 统计每个文件的行数: 统计总行数: 统计运行时间: 支持指定统计文件类型,排除不想统计的文件类型: 递归统计文件夹下包括子文件件下的文件的行数: 排除空行: # coding=utf-8 import os import time basedir = '/root/sc

Java关于条件判断练习--统计一个src文件下的所有.java文件内的代码行数(注释行、空白行不统计在内)

要求:统计一个src文件下的所有.java文件内的代码行数(注释行.空白行不统计在内) 分析:先封装一个静态方法用于统计确定的.java文件的有效代码行数.使用字符缓冲流读取文件,首先判断是否是块注释开头,接着判断是否是块注释结尾,再判断是否是单行注释或者空白行,若都不是则是有效代码,统计行数+1. 对于文件夹路径,采用递归的方法判断子条目是文件还是文件夹,是文件就调用静态统计方法.源代码: public class CalculateRow { public static void main(

统计java方法(函数)的代码行数

今天想对一个java项目超过100行的方法进行一些代码优化.需要统计一下项目中的java类有哪些方法的代码超过了100行.在网上没找到类似的统计工具,就自己写了段代码进行统计. 编码思路:因为一个java类,最外层的{}可以标识类,次外层的{}就是方法或内部类了.为了便于编码,我把内部类也当作方法处理了.只要把次外层的{和}配对就是一个完整的方法了.因此我用先进后出的栈存储一个数组.数组的第一个元素是某个方法起始行,第二个元素是该行的行号.这样既能通过行号相减得到方法的行数,又能记录方法的位置.