java 統計程式專案下面所有Java類的個數和有效程式碼行數的遞迴演算法
阿新 • • 發佈:2019-02-04
本人這些天花了九牛二虎之力攻讀了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專案的編碼,改變讀寫時的編碼,保持一致時,即可避免亂碼。接著就是採用遞迴演算法,遍歷所有子資料夾裡的所有子檔案。最後就是可以儲存結果。一開始,準備採用引數傳遞來記錄檔案數和行數,但是由於遞迴,傳遞引數變得有些困難,最後就採用了全域性變數來記錄。