最近突发奇想,用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编写开放源代码”揭示了这是一个使用Java编程语言开发的统计应用程序,而且它的源代码是公开的,意味着用户可以查看、学习甚至修改代码以适应自己的需求。这种开源软件通常遵循一定的...
用java语言编写的一个程序实现源代码的代码统计功能,内容分为4个方面,分别是:1.物理行:代码的总行数(包括代码行,注释行,空行) 2.代码行:编写的代码 3.注释行:指单行注释和多行注释 4.空行:指源代码的空行
1. **Java语言基础**:此程序是用Java编写的,这意味着它遵循Java的语法规则,包括类、对象、方法、变量、控制流结构等。Java是一种跨平台的面向对象的编程语言,具有丰富的类库和强大的功能。 2. **源代码行计数**...
【标题】"JAVA编写SVN统计代码数量系统"是一个基于Spring Boot框架的项目,用于统计在Subversion(SVN)版本控制系统中的代码提交情况。它能够详细地分析每个团队成员在SVN仓库中的代码贡献量。 【核心知识点】: ...
在Java编程中,开发者会利用文本编辑器编写源代码,通过构建工具(如Maven或Gradle)管理依赖,使用IDE(集成开发环境,如IntelliJ IDEA或Eclipse)进行调试和测试,最后将编译后的字节码部署到服务器上。...
总结来说,这个Java编写的源代码行数统计器利用了Swing或AWT库创建用户界面,提供了一个易于使用的工具来帮助开发者估算代码规模。它可能还具备自定义配置、便携式执行文件以及详细的使用说明,确保用户能够方便地...
1. **源代码**:开发者提供了源代码,这可能是用Java编写的,展示了如何实现代码统计的功能。通过查看源代码,我们可以学习到文件读取、文本解析、数据结构和算法等技术。 2. **文档**:可能包含工具的使用说明、...
这意味着Java代码统计工具是一个基于Java编写的程序,用户需要先安装JRE才能在计算机上运行这个工具。 总的来说,Java代码统计工具通过提供丰富的统计信息,可以帮助开发人员和团队更好地管理代码库,提升代码质量...
本篇将深入探讨一个由Java编写的日历程序,该程序不仅能够显示日期,还具备统计累计时间并进行提醒的功能。 一、程序结构与原理 1. **基础框架**:Java日历程序通常基于Swing或JavaFX等图形用户界面库构建,它们...
Java编写的中文智能分词源程序是用于处理和分析中文文本的一种重要工具,它在信息检索、搜索引擎优化、自然语言处理等领域有着广泛的应用。在这个源程序中,开发者使用了Java编程语言来实现智能分词算法,使得程序...
标题中的“代码统计器源码java编写”表明这是一个使用Java编程语言开发的工具,它的主要功能是对指定目录下的各类文件进行统计分析。这个工具可能是为了帮助开发者了解项目中不同类型的文件数量、代码行数等信息,...
8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个目标文件 摘要:Java源码,网络相关,浏览器 Java编写的HTML浏览器源代码,一个很简单甚至不算是...
标题 "调查问卷统计程序的源代码发布" 暗示了这是一个关于开发和分享用于处理调查问卷数据的软件项目。这个程序可能具有收集、分析和可视化数据的功能,旨在帮助研究人员或者数据分析人员更有效地管理和理解他们的...
- 对于程序员来说,还可以编写一个简单的Java程序,通过读取文件,解析每一行内容,判断是否为代码行、注释行或空行。这种方法虽然繁琐,但可以自定义统计规则。 无论哪种方法,统计结果都应该包括以下几部分: - ...
"用Shell扩展实现源代码统计程序"的标题和描述暗示了我们要利用Shell脚本来编写一个程序,这个程序可以自动统计源代码文件的数量、行数,以及可能包含的其他指标,如空行、注释行等。下面我们将详细探讨如何使用...
Java编写的源代码行数统计器是一款用于计算项目中源代码行数的工具,它具有用户友好的界面和高精度的统计能力。该工具的主要功能是帮助开发者或团队管理者快速了解项目的规模,评估代码复杂性,以及跟踪项目的发展...
在编写源代码时,会用到Java的基本语法,如变量声明、条件语句(if-else)、循环(for或while)、方法定义以及类的创建等。这些基本元素构成了程序的核心逻辑,用于读取文本、解析单词并进行统计。 2. Swing库与...
源代码行数统计工具是一种用于计算编程语言源代码文件中行数的实用程序。这个工具支持多种编程语言,包括C、C++、C#、Java、VB(Visual Basic)和Delphi。这些语言在软件开发中占据着重要的地位,因此能够针对它们...
【源代码统计工具(完美版)】是一款专为程序员和软件开发团队设计的高效工具,旨在帮助用户快速、准确地统计项目中的源代码行数。它不仅能够计算总代码量,还能分别统计不同编程语言的代码行数,这对于评估项目规模...