Java编写的简单代码统计程序原代码

最近突发奇想,用Java编写了一个代码统计程序,主要统计这样几个数据:
一个项目里面的代码总行数,原代码文件总数,空白行数,import语句数,类数量,接口数量,
以及:
计算出平均每个文件的行数以后,
行数<=line 的文件数量
2倍,3倍,4倍,5倍,6倍,7倍,8倍,9倍,10倍,10倍以上的文件数量.
由此可以知道整个项目里面的文件行数与这些文件数量的关系.代码如下:
package com;

import java.util.*;
import java.io.*;

public class FileCompute {
	public static void main(String args[]){
		String filepath ="C://spring-framework-3.0.0.M1";
		DirStat ds = new DirStat();
		ds.readDir(filepath);
		System.out.println("LineNumber:" + ds.dirlines);
		System.out.println("FileNumber:" + ds.filenum);	
		System.out.println("blanklines:" + ds.blanklines);			
		System.out.println("importlines:" + ds.importlines);	
		System.out.println("class number:"+ds.classnum);
		System.out.println("inter number:"+ ds.internum);
		
		System.out.println("<=1   " + ds.num1);
		System.out.println("<=2   " + ds.num2);
		System.out.println("<=3   " + ds.num3);
		System.out.println("<=4   " + ds.num4);
		System.out.println("<=5   " + ds.num5);
		System.out.println("<=6   " + ds.num6);
		System.out.println("<=7   " + ds.num7);
		System.out.println("<=8   " + ds.num8);
		System.out.println("<=9   " + ds.num9);
		System.out.println("<=10  " + ds.num10);		
		System.out.println("<=11  " + ds.num11);		
		System.out.println("Average:" + ds.dirlines / ds.filenum);
	}
}

/**
 * 统计单一文件的行数
 * @author baoxinyu-itwb
 *
 */
class FileStat{
	public String filename=""; //文件名
	public int fileSize = 0;   //文件大小
	public int fileLines = 0;  //文件行数
	public int blanklines = 0; //空白行数
	public int importlines = 0; //import行数
	public int classnum = 0;
	public int internum = 0;
	public int num1=0;	//100行以内
	public int num2=0;  //100-200
	public int num3=0;  //200-300
	public int num4=0;  //300-400
	public int num5=0;  //400-500
	public int num6=0;  //500-6
	public int num7=0;  //6-7
	public int num8=0;  //7-8
	public int num9=0;  //8-9
	public int num10=0;  //9-10
	public int num11=0;  //10-
	
	private int avenum = 156;
	public void readFile(String sfilename){
		try{
		File file = new File(sfilename);
		if ( file.exists()  && file.isFile() ){
            FileReader fileread=new FileReader(file);
            BufferedReader bufread=new BufferedReader(fileread);
            String read="";
            while((read=bufread.readLine())!=null){
            	fileLines ++;
            	if (read.equals("")){
            		blanklines ++;
            	}else if(read.startsWith("import")){
            		importlines ++;
            	}else if(read.startsWith("public class")){
            		classnum ++;
            	}else if(read.startsWith("public interface")){
            		internum ++;
            	}
            }
            if (fileLines<=avenum){
            	num1 =1;
            }else if(fileLines<=avenum*2){
            	num2 = 1;
            }else if(fileLines<=3* avenum){
            	num3 = 1;
            }else if(fileLines <= 4* avenum){
            	num4 = 1;
            }else if(fileLines <= 5 * avenum){
            	num5 = 1;
            }else if(fileLines <= 6 * avenum){
            	num6 = 1;
            }else if(fileLines <= 7 * avenum){
            	num7 = 1;
            }else if (fileLines <= 8 * avenum){
            	num8 = 1;
            }else if (fileLines <= 9 * avenum){
            	num9 = 1;
            }else if(fileLines <= 10 * avenum){
            	num10 =1;
            }else{
            	num11 = 1;
            }
            filename = sfilename;
            
		}
		}catch(Exception e){
			e.printStackTrace();
			filename ="";
			fileLines = 0;
		}
	}
}

class DirStat{
	public String dirname ="";
	public int dirlines =0;
	public int blanklines = 0;
	public int importlines = 0;
	public int classnum = 0;
	public int internum = 0;
	public int num1=0;	//100行以内
	public int num2=0;  //100-200
	public int num3=0;  //200-300
	public int num4=0;  //300-400
	public int num5=0;  //400-500
	public int num6=0;  //500-	
	public int num7=0;  //6-7
	public int num8=0;  //7-8
	public int num9=0;  //8-9
	public int num10=0;  //9-10
	public int num11=0;  //9-10
	
	public int filenum = 0;
	
	public void readDir(String dirname){
		try{
			File dirfile = new File(dirname);
			if (dirfile.exists() && dirfile.isDirectory()){
				File[] child = dirfile.listFiles();
				int i =0;
				for(i=0;i<child.length;i++){
					if (child[i].isFile() && 
							child[i].getAbsolutePath().endsWith("java")){
						FileStat fs = new FileStat();
						fs.readFile(child[i].getAbsolutePath());
						//System.out.println(child[i].getAbsolutePath());
						dirlines = dirlines + fs.fileLines;
						blanklines = blanklines + fs.blanklines;
						importlines = importlines + fs.importlines;
						classnum = classnum + fs.classnum;
						internum = internum + fs.internum;
						num1+= fs.num1;
						num2+= fs.num2;
						num3+= fs.num3;
						num4+= fs.num4;
						num5+= fs.num5;
						num6+= fs.num6;
						num7+= fs.num7;
						num8+= fs.num8;
						num9+= fs.num9;
						num10+= fs.num10;	
						num11+= fs.num11;
						
						filenum = filenum + 1;
					}else if (child[i].isDirectory()){
						DirStat ds = new DirStat();
						ds.readDir(child[i].getAbsolutePath());
						//System.out.println(child[i].getAbsolutePath());
						dirlines = dirlines + ds.dirlines;
						blanklines = blanklines + ds.blanklines;
						importlines = importlines + ds.importlines;
						classnum = classnum + ds.classnum;
						internum = internum + ds.internum;						
						num1+= ds.num1;
						num2+= ds.num2;
						num3+= ds.num3;
						num4+= ds.num4;
						num5+= ds.num5;
						num6+= ds.num6;
						num7+= ds.num7;
						num8+= ds.num8;
						num9+= ds.num9;		
						num10+= ds.num10;
						num11+= ds.num11;
						
						filenum = filenum +ds.filenum ;
						System.out.println(child[i].getAbsolutePath() +" --- "+ ds.dirlines);						
					}
				}
			}
		}catch (Exception e){
			e.printStackTrace();
			dirname ="";
			dirlines =0;
		}
	}
}



我对自己本机的项目文件进行了一下分析,结果不是很乐观,结论以后再说.
于是又找到了本机下载的spring3.0原代码分析了一把.
下面是一些相关的数据:
代码总行数: 503003
文件总数: 3224
空白行: 67903
import行: 20708
类定义: 2199
接口定义: 409
文件平均行数:156
1倍以内的文件:2344
1-2倍: 534
2-3倍: 168
3-4倍: 73
4-5倍: 39
5-6倍: 17
6-7倍: 18
7-8倍: 7
8-9倍: 9
9-10倍: 4
10倍以上: 11
这个结论和我对自己公司的一个项目的统计结果基本上是一致的,就是说,平均行数都是100-200,150行以内的文件占了很大的部分.
随代码长度的增加,文件数量急剧减少.
10倍以上的文件比9-10倍的文件还要多.
整体来看,一个项目就像有一堆类一样,但仔细看看,每个类又没有多大,但总有几个庞然大物存在.
[/size]

你可能感兴趣的:(java,spring)