java 统计程序项目下面所有Java类的个数和有效代码行数的递归算法

本人这些天花了九牛二虎之力攻读了XMPP通信协议的asmack 源码,读完后想看看到底有多少个java文件,以及有多少行源码。于是就准备写个

程序统计一下,看了几位前辈写得源码,自己综合了一下。吸收精华之后,就有了这篇博文。

思路很简单,通过for 循环遍历文件,遇到java文件,则统计代码行数,遇到目录则继续递归遍历,直到统计玩项目下所有文件夹下的所有java 文件。

代码奉上,注释很清楚了,这里就不多说了。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class CodeStatics {
	/**
	 * @author lishengfei
	 * @date 2014-12-1 17:49:52
	 * @CopyRight zzjskj
	 */
	
	/**
	 * 定义两个全局变量,生命周期是整个类
	 * 
	 */
	public static int sumFile = 0;// 总文件数
	public static int sumLine = 0;// 总行数

	public CodeStatics() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * 统计代码行数
	 * 
	 * @param inFile
	 *            输入的文件,包含子文件和子文件夹
	 * @param bw
	 *            缓冲输出流
	 * @throws IOException
	 */
	public static void codeStatics(File inFile, BufferedWriter bw)
			throws IOException {

		for (File file : inFile.listFiles()) {
			if (file.isFile() && file.getName().endsWith(".java")) {//为java 文件时
				int line = 0;

				BufferedReader br = new BufferedReader(new InputStreamReader(
						new FileInputStream(file), "utf-8"));//以utf-8 格式读入,若文件编码为gkb 则改为gbk
				String s = null;
				while ((s = br.readLine()) != null) {
					s = s.replaceAll("\\s", "");// \\s表示 空格,回车,换行等空白符,
												// 将空白符替换为空字符""
					
					if ("".equals(s)
							|| s.startsWith("//")
							|| s.startsWith("/*")  
							|| s.startsWith("/**") 
							|| s.startsWith("*")) {//过滤掉注释
					} else {
						line++;
						System.out.println(line + ":" + s);
					}
				}
				br.close();//关闭读入流
				System.out.println(file.getName() + "\t\t" + line);// \t制表符(TAB)

				bw.newLine();// 写入换行符
				bw.write(file.getName() + "\t\t" + line);// 写入类名称
				bw.newLine();// 换行
				bw.flush();// 把缓冲区的数据强行写出

				sumFile++;
				sumLine += line;
				System.out.println("统计:" + sumFile + "个类\t" + sumLine + "行");
			} else if (file.isDirectory()) {// 当file 为目录时,递归遍历

				codeStatics(file, bw);

			}

		}

	}

	public static void main(String[] args) {
		try {
			File inFile = new File("D:\\workspace\\CodeStatics");// 要统计的项目
			FileOutputStream ps = new FileOutputStream("D:/result.txt");// 将统计结果输出到txt文件
			BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(ps,"utf-8"));
			bw.write("类名\t\t行数");

			codeStatics(inFile, bw);// 递归入口

			bw.newLine();
			bw.write("一共:" + sumFile + "个类\t\t" + sumLine + "行代码!");

			bw.flush();
			bw.close();//关闭输出流
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
下面是运行结果:


总结:该源码的特色是可以根据java项目的编码,改变读写时的编码,保持一致时,即可避免乱码。接着就是采用递归算法,遍历所有子文件夹里的所有子文件。最后就是可以保存结果。一开始,准备采用参数传递来记录文件数和行数,但是由于递归,传递参数变得有些困难,最后就采用了全局变量来记录。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值