代码统计

http://www.oschina.net/code/snippet_566026_17466

 

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
/**
  * 代码条数统计
  * @author user
  */
public class CodeCount{
 
     /**
      * 正则表达式主要是匹配多行注释
      */
     private static Pattern pattern = Pattern.compile( "/\\*([\\s|\\S])+?\\*/" );
     
     // 基本文件目录
     private File baseDir;
     // 拥有的文件列表
     private List<String> fileList = new ArrayList<String>();
     // 文件数量
     private int fileCount = 0 ;
     // 代码行数
     private int lineCount = 0 ;
     // 匹配表达式
     private String matchRegex = "[a-zA-Z0-9_-]*.java" ;
 
     public CodeCount(File baseDir) {
         this .baseDir = baseDir;
     }
     
     public CodeCount(File baseDir, String matchRegex) {
         this .baseDir = baseDir;
         this .matchRegex = matchRegex;
     }
     
     /**
      * 统计入口
      */
     public void count() {
         if (!baseDir.isHidden()){
             if (baseDir.isDirectory()) {
                 for (File child : baseDir.listFiles()) {
                     CodeCount count = new CodeCount(child, matchRegex);
                     count.count();
                     fileCount += count.fileCount;
                     lineCount += count.lineCount;
                     fileList.addAll(count.fileList);
                 }
             } else {
                 if (baseDir.getName().matches(matchRegex)){
                     try {
                         fileList.add(baseDir.getPath());
                         fileCount ++;
                         String content = getFileContent(baseDir);
                         int line = getCodeCount(content);
                         lineCount += line;
                     } catch (IOException e) {
                         e.printStackTrace();
                     }
                 }
             }
         }
     }
 
     /**
      * 获取文件f中的文本内容
      *
      * @param f
      * @return
      * @throws IOException
      */
     public String getFileContent(File f) throws IOException {
         StringBuffer sb = new StringBuffer();
         FileInputStream input = new FileInputStream(f);
         byte [] b = new byte [ 1024 ];
         int count = 0 ;
         while ((count = input.read(b)) != - 1 ) {
             sb.append( new String(b, 0 , count));
         }
         input.close();
         return sb.toString();
     }
 
     /**
      * 统计文本中的代码行数 1.用正则表达式出去块注释即多行注释 2.再将字符串按照回车符分割成字符串数组 3.除去空白行或者单行注释行
      *
      * @param content
      *            输入文本
      * @return 文本中代码行数
      */
     public int getCodeCount(String content) {
         int rowCount = 0 ;
         Matcher matcher = pattern.matcher(content);
         content = matcher.replaceAll( " " );
         String ss[] = content.split( "\n" );
         for (String s : ss) {
             if (s.trim().length() > 0 && !s.trim().startsWith( "//" ))
                 rowCount++;
         }
         return rowCount;
     }
 
     /**
      * 打印输出结果
      */
     public void print(){
         // 统计结果输出
         System.out.println(baseDir + "中所有文件:" );
         for (String file : fileList) {
             System.out.println(file);
         }
         System.out.println();
         System.out.println( "文件总数:" + fileCount);
         System.out.println( "总代码行数" + lineCount);
     }
     
     public File getBaseDir() {
         return baseDir;
     }
 
     public void setBaseDir(File baseDir) {
         this .baseDir = baseDir;
     }
 
     public List<String> getFileList() {
         return fileList;
     }
 
     public void setFileList(List<String> fileList) {
         this .fileList = fileList;
     }
 
     public int getFileCount() {
         return fileCount;
     }
 
     public void setFileCount( int fileCount) {
         this .fileCount = fileCount;
     }
 
     public int getLineCount() {
         return lineCount;
     }
 
     public void setLineCount( int lineCount) {
         this .lineCount = lineCount;
     }
 
     public String getMatchRegex() {
         return matchRegex;
     }
 
     public void setMatchRegex(String matchRegex) {
         this .matchRegex = matchRegex;
     }
 
     public static void main(String[] args) throws Exception {
         String path = "S:\\快盘\\workspace\\commons-godway" ;
         CodeCount code = new CodeCount( new File(path));
         code.count();
         code.print();
     }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值