Java文件扫描

 

package com.yhj.common.counter;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import com.yhj.common.io.FileUtil;

/**
* com.yhj.common.counter.CodeCounter.java
* be created by 2009-12-10 下午05:21:31+
* 本类的主要功能:
* <p>
* 统计某个文件夹下文件 Java文件 以及
* 统计指定目录下以及其子目录下的所有java文件中代码行数 注释数 空行数等
* </p>
*
@author 一线天色 天宇星辰
*
*/
public class CodeCounter {
static long codeLines = 0; //代码行数
static long commentLines = 0; //注释行署
static long blankLines = 0; //空白行数
static long totalFileCount = 0; //总共文件数目
static long totalFolderCount = 0;//文件夹文件数目
static long javaFileCount = 0; //Java文件数目
static boolean isOne=false; //将每次生成的文件生成到一个文件中的标示
static ArrayList<File> fileArray = new ArrayList<File>();
private static String fileName=null;

/**
* 可以统计指定目录下以及其子目录下的所有java文件中代码
*/

public static void codeCounter(String path) {
//统计程序运行时间
long beginTime = System.currentTimeMillis();
//统计运行消耗的内存
long beginMemory = Runtime.getRuntime().freeMemory();
//要统计的文件夹
File file = new File(path);
SimpleDateFormat simpleDateFormat
=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String beginDetailTime
=simpleDateFormat.format(new Date());
System.out.println(
"=====================================");
writeToLog(
"=====================================");
System.out.println(
"开始扫描文件夹 "+path+"...");
writeToLog(
"开始扫描文件夹 "+path+"...");
//存储文件的数据
ArrayList<File> al = 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);
long endMemory = Runtime.getRuntime().freeMemory();
long billMemory=beginMemory-endMemory;
long endTime = System.currentTimeMillis();
long sec=(endTime-beginTime)/1000;
System.out.println(
"程序开始时间:"+beginDetailTime);
writeToLog(
"程序开始时间:"+beginDetailTime);
String endDetailTime
=simpleDateFormat.format(new Date());
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");

}

// 获得目录下的文件和子目录下的文件
private static ArrayList<File> getFile(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()+"扫描结束!");
return fileArray;

}

// 统计文件
private static void count(File f) {
BufferedReader br
= null;
boolean flag = false;
try {
br
= new BufferedReader(new FileReader(f));
String line
= "";
while ((line = br.readLine()) != null) {
line
= line.trim(); // 除去注释前的空格
if (line.matches("^[ ]*$")) { // 匹配空行
blankLines++;
}
else if (line.startsWith("//")) {
commentLines
++;
}
else if (line.startsWith("/*") && !line.endsWith("*/")) {
commentLines
++;
flag
= true;
}
else if (line.startsWith("/*") && line.endsWith("*/")) {
commentLines
++;
}
else if (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();
}
}
}
}



private static void writeToLog(String data) {
try {
if(!isOne)
{
SimpleDateFormat simpleDateFormat
=new SimpleDateFormat("yyyy-MM-dd HH.mm.ss");
fileName
=simpleDateFormat.format(new Date())+".log";
isOne
=true;
}
FileUtil.writeStringToFile(
"F:/YHJ日志生成区",fileName, data+"\n", "UTF-8",true);
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
public static void main(String[] args) {
codeCounter(
"C:/Program Files");
}
}

 

 

 

posted @ 2010-06-07 12:58  Me疯子_(~  阅读(861)  评论(0编辑  收藏  举报