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);  
    }  

}
原文地址:https://www.cnblogs.com/yshyee/p/7807967.html