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

以下是一个Java程序,可以统计一个文件夹中所有文件的代码行数(包括空白行和注释): ```java import java.io.*; public class CodeCounter { private static long codeLines = 0; // 代码行数 private static long commentLines = 0; // 注释行数 private static long blankLines = 0; // 空白行数 public static void main(String[] args) { String folderPath = "路径/文件夹"; // 文件夹路径 File folder = new File(folderPath); if (!folder.isDirectory()) { System.out.println("请指定文件夹路径!"); return; } countFiles(folder); System.out.println("代码行数:" + codeLines); System.out.println("注释行数:" + commentLines); System.out.println("空白行数:" + blankLines); } private static void countFiles(File folder) { File[] files = folder.listFiles(); for (File file : files) { if (file.isDirectory()) { countFiles(file); } else { countFile(file); } } } private static void countFile(File file) { BufferedReader reader = null; boolean isComment = false; // 是否在注释中 try { reader = new BufferedReader(new FileReader(file)); String line; while ((line = reader.readLine()) != null) { line = line.trim(); if (line.startsWith("/*")) { // 多行注释开始 isComment = true; commentLines++; } else if (line.startsWith("*")) { // 多行注释中 commentLines++; } else if (line.startsWith("*/")) { // 多行注释结束 isComment = false; commentLines++; } else if (line.startsWith("//")) { // 单行注释 commentLines++; } else if (isComment) { // 多行注释中 commentLines++; } else if (line.length() == 0) { // 空白行 blankLines++; } else { // 代码行 codeLines++; } } } catch (IOException e) { e.printStackTrace(); } finally { try { if (reader != null) { reader.close(); } } catch (IOException e) { e.printStackTrace(); } } } } ``` 使用时,只需要修改`folderPath`变量为需要统计的文件夹路径即可。程序会递归遍历所有子文件夹和文件,统计它们的代码行数、注释行数和空白行数,并输出结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值