1. 程式人生 > >java 統計程式專案下面所有Java類的個數和有效程式碼行數的遞迴演算法

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專案的編碼,改變讀寫時的編碼,保持一致時,即可避免亂碼。接著就是採用遞迴演算法,遍歷所有子資料夾裡的所有子檔案。最後就是可以儲存結果。一開始,準備採用引數傳遞來記錄檔案數和行數,但是由於遞迴,傳遞引數變得有些困難,最後就採用了全域性變數來記錄。