<< 使用Apache POI 创建和读取MS Excel文档 | 首页 | Ehcache分布式缓存的最小化配置 >>

一个简单的统计软件代码行数的Java类

扫描指定目录以及子目录里的*.java源文件,累计总行、空白行、注释行,并计算代码行

import java.io.File;
import java.io.FileNotFoundException;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

/**
 * 统计系统代码行数
 * 要说明的是:按照MVC框架,所有的业务逻辑是在Java类里实现的,View展现层不作为代码计算,所以jsp不计算在代码内。
 *
 * @author Administrator
 *
 */
public class CountCodeLines {
 static int codeLines = 0;

 static int whiteLines = 0;

 static int commentLines = 0;

 static int tatolLines = 0;

 static boolean bComment = false;

 public static void main(String[] args) {

  StringBuffer pathName = new StringBuffer(
    "F:\\svn_local\\01 code\\importMeter\\src");
  ComputeDirectoryAndFiles(pathName, 0);
  System.out.println("Code Lines : "
    + (codeLines = tatolLines - commentLines - whiteLines));
  System.out.println("White Lines : " + whiteLines);
  System.out.println("Comment Lines : " + commentLines);

 }

 public static void ComputeDirectoryAndFiles(StringBuffer pathName, int level) {
  File directory = new File(pathName.toString());
  File[] files = directory.listFiles();
  String prefix = "";
  for (int i = 0; i < files.length; i++) {
   prefix += "** ";
  }
  if (directory.isDirectory()) {
   for (int i = 0; i < files.length; i++) {
    if (files[i].isFile()
      && files[i].getName().matches(
        "^[a-zA-Z[^0-9]]\\w*.java$")) {

     computeLines(files[i]);
    }
    if (files[i].isDirectory()) {

     pathName.append("/" + files[i].getName());
     level++;
     ComputeDirectoryAndFiles(pathName, level);
     int start = pathName.toString().length()
       - files[i].getName().length() - 1;
     int end = pathName.toString().length();
     pathName.delete(start, end);

     level--;
    }
   }
  }
 }

 public static void computeLines(File file) {
  BufferedReader bf = null;

  try {
   bf = new BufferedReader(new FileReader(file));
   String lineStr = "";
   while ((lineStr = bf.readLine()) != null) {
    // 总行数
    tatolLines++;
    // 计算空行
    whiteLines(lineStr);
    // 统计代码行数
    commendLines(lineStr);
    // 计算代码的行数
    // codeLines(lineStr);
   }
  } catch (FileNotFoundException e) {
   System.out.println("文件没有找到");
  } catch (IOException ee) {
   System.out.println("输入输出异常 ");
  } finally {
   if (bf != null) {
    try {
     bf.close();
     bf = null;
    } catch (Exception e) {
     System.out.println("关闭BufferReader时出错");
    }
   }
  }
 }

 public static void whiteLines(String lineStr) {
  if (lineStr.matches("^[\\s&&[^\\n]]*$")) {
   whiteLines++;
  }

 }

 public static void commendLines(String lineStr) {

  // 判断是否是一个注释行
  // 这里是单行注释的如 /*..... */或/**.... */
  if (lineStr.matches("\\s*/\\*{1,}.*(\\*/).*")) {

   commentLines++;
  }
  /**
   * 这里是多行注释的
   */
  // 这里的是当开始为/**或/*但是没有 */ 关闭时
  else if (lineStr.matches("\\s*/\\*{1,}.*[^\\*/].*")) {

   commentLines++;
   bComment = true;
  } else if (true == bComment) {

   commentLines++;
   if (lineStr.matches("\\s*[\\*/]+\\s*")) {
    bComment = false;
   }
  } else if (lineStr.matches("^[\\s]*//.*")) {

   commentLines++;
  }

 }
 // public static void codeLines(String lineStr)
 // {
 // if(lineStr.matches("\\s*[[^/\\*]|[//]]+.*"))
 // codeLines++;
 // }
}

标签 :



发表评论 发送引用通报