packagecom.yhj.common.counter;importjava.io.BufferedReader;importjava.io.File;importjava.io.FileNotFoundException;importjava.io.FileReader;importjava.io.IOException;importjava.text.SimpleDateFormat;importjava.util.ArrayList;importjava.util.Date;importcom.yhj.common.io.FileUtil;/*** com.yhj.common.counter.CodeCounter.java
* be created by 2009-12-10 下午05:21:31+
* 本类的主要功能:
*
* 统计某个文件夹下文件 Java文件 以及
* 统计指定目录下以及其子目录下的所有java文件中代码行数 注释数 空行数等
*
*@author一线天色 天宇星辰
**/publicclassCodeCounter {staticlongcodeLines=0;//代码行数staticlongcommentLines=0;//注释行署staticlongblankLines=0;//空白行数staticlongtotalFileCount=0;//总共文件数目staticlongtotalFolderCount=0;//文件夹文件数目staticlongjavaFileCount=0;//Java文件数目staticbooleanisOne=false;//将每次生成的文件生成到一个文件中的标示staticArrayListfileArray=newArrayList();privatestaticString fileName=null;/*** 可以统计指定目录下以及其子目录下的所有java文件中代码*/publicstaticvoidcodeCounter(String path) {//统计程序运行时间longbeginTime=System.currentTimeMillis();//统计运行消耗的内存longbeginMemory=Runtime.getRuntime().freeMemory();//要统计的文件夹File file=newFile(path);
SimpleDateFormat simpleDateFormat=newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String beginDetailTime=simpleDateFormat.format(newDate());
System.out.println("=====================================");
writeToLog("=====================================");
System.out.println("开始扫描文件夹"+path+"...");
writeToLog("开始扫描文件夹"+path+"...");//存储文件的数据ArrayListal=getFile(file);
System.out.println("=====================================");
writeToLog("=====================================");
System.out.println("开始统计文件...");
writeToLog("开始统计文件...");for(File f : al) {if(f.getName().matches(".*\\.java$"))//匹配java格式的文件{
System.out.println("正在统计文件:"+f.getPath());
writeToLog("正在统计文件:"+f.getPath());
javaFileCount++;
count(f);
}
}
System.out.println("完成统计!");
writeToLog("完成统计!");
System.out.println("=====================================");
writeToLog("=====================================");
System.out.println("统计结果如下:");
writeToLog("统计结果如下:");
System.out.println("文件夹总数:"+totalFolderCount+"个");
writeToLog("文件夹总数:"+totalFolderCount+"个");
System.out.println("文件总个数:"+totalFileCount+"个");
writeToLog("文件总个数:"+totalFileCount+"个");
System.out.println("Java文件数:"+javaFileCount+"个");
writeToLog("Java文件数:"+javaFileCount+"个");
System.out.println("代码行数:"+codeLines);
writeToLog("代码行数:"+codeLines);
System.out.println("注释行数:"+commentLines);
writeToLog("注释行数:"+commentLines);
System.out.println("空白行数:"+blankLines);
writeToLog("空白行数:"+blankLines);longendMemory=Runtime.getRuntime().freeMemory();longbillMemory=beginMemory-endMemory;longendTime=System.currentTimeMillis();longsec=(endTime-beginTime)/1000;
System.out.println("程序开始时间:"+beginDetailTime);
writeToLog("程序开始时间:"+beginDetailTime);
String endDetailTime=simpleDateFormat.format(newDate());
System.out.println("程序结束时间:"+endDetailTime);
writeToLog("程序结束时间:"+endDetailTime);
System.out.println("程序运行共耗时间:"+sec/60+"分"+sec%60+"秒");
writeToLog("程序运行共耗时间:"+sec/60+"分"+sec%60+"秒");
System.out.println("程序运行共耗内存:"+billMemory*1.0/1024+"KB");
writeToLog("程序运行共耗内存:"+billMemory*1.0/1024+"KB");
}//获得目录下的文件和子目录下的文件privatestaticArrayListgetFile(File f) {
System.out.println("开始扫描子文件夹"+f.getPath()+"...");
writeToLog("开始扫描子文件夹"+f.getPath()+"...");
File[] ff=f.listFiles();for(File child : ff) {if(child.isDirectory()) {
System.out.println("发现文件夹:"+child.getPath());
writeToLog("发现文件夹:"+child.getPath());
totalFolderCount++;
getFile(child);
}else{
fileArray.add(child);
totalFileCount++;
System.out.println("发现文件:"+child.getPath());
writeToLog("发现文件:"+child.getPath());
}
}
System.out.println("文件夹"+f.getPath()+"扫描结束!");
writeToLog("文件夹"+f.getPath()+"扫描结束!");returnfileArray;
}//统计文件privatestaticvoidcount(File f) {
BufferedReader br=null;booleanflag=false;try{
br=newBufferedReader(newFileReader(f));
String line="";while((line=br.readLine())!=null) {
line=line.trim();//除去注释前的空格if(line.matches("^[ ]*$")) {//匹配空行blankLines++;
}elseif(line.startsWith("//")) {
commentLines++;
}elseif(line.startsWith("/*")&&!line.endsWith("*/")) {
commentLines++;
flag=true;
}elseif(line.startsWith("/*")&&line.endsWith("*/")) {
commentLines++;
}elseif(flag==true) {
commentLines++;if(line.endsWith("*/")) {
flag=false;
}
}else{
codeLines++;
}
}
}catch(FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}finally{if(br!=null) {try{
br.close();
br=null;
}catch(IOException e) {
e.printStackTrace();
}
}
}
}privatestaticvoidwriteToLog(String data) {try{if(!isOne)
{
SimpleDateFormat simpleDateFormat=newSimpleDateFormat("yyyy-MM-dd HH.mm.ss");
fileName=simpleDateFormat.format(newDate())+".log";
isOne=true;
}
FileUtil.writeStringToFile("F:/YHJ日志生成区",fileName, data+"\n","UTF-8",true);
}catch(Exception e) {//TODO Auto-generated catch blocke.printStackTrace();
}
}publicstaticvoidmain(String[] args) {
codeCounter("C:/Program Files");
}
}