統計java程式碼行數和jar包中*.class程式碼的行數
阿新 • • 發佈:2019-02-05
自己寫了一個簡單的小工具,統計一下指定專案路徑下java行數和指定路徑下jar包中.class 檔案的程式碼行數。
具體內容如下:
1:統計指定目錄下所有的*.java 檔案的程式碼行數,檔案為JavaTotal.java(可單獨執行);
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; /** * 統計指定專案的目錄下的*.java程式碼行數 * @author aflyun * @date 2016.02.16 * @version 1.0 */ public class JavaTotal { //專案java檔案所在目錄 public static String javaPath = "D:/KuYuPrograms/tclshop/src/"; //統計程式碼行數 public static Integer countCode = 0; public static int runJavaTotal(){ try { File filetxtPath = new File("D:/javaFileCount.txt");//輸出要統計的檔案資訊 PrintWriter pw = new PrintWriter(new FileWriter(filetxtPath)); List<File> list = total(javaPath); for (File file : list) { String javaName = file.getAbsolutePath().replace("\\", "/"); if(javaName.endsWith(".java")){ pw.println(javaName); } } pw.println("總共java檔案數量 :" + list.size()); pw.close(); System.err.println("java檔案數量:"+list.size()); countJavaLine(list); System.err.println("java中總程式碼行數:" + countCode); } catch (Exception e) { // TODO: handle exception } return countCode; } /** * 獲取所有的檔案 * @param path 獲取檔案的路徑 * @return */ public static List<File> total(String path){ List<File> fileList = null; try { fileList = new ArrayList<File>(); File filePath = new File(path); File[] files = filePath.listFiles();//listFiles能夠獲取當前資料夾下的所有檔案和資料夾 for (File file : files) { if(file.isFile() && file.getName().endsWith(".java")){ fileList.add(file); }else { fileList.addAll(fileList.size(), total(file.getPath())); } } } catch (Exception e) { // TODO: handle exception } return fileList; } /** * 統計專案中java程式碼的行數 * @param listFile 檔案的集合 */ public static void countJavaLine(List<File> listFile){ try { for (File file : listFile) { if(file.getName().endsWith(".java")){ FileReader fr = new FileReader(file); BufferedReader br = new BufferedReader(fr); String line = ""; while((line = br.readLine()) != null){ countCode ++; } } } } catch (Exception e) { System.err.println("統計java程式碼行數出錯!"); } } //==========================================================================================// public static void main(String[] args) throws IOException { long start = System.nanoTime(); runJavaTotal(); long end = System.nanoTime(); System.out.print("cost: " + (end - start)/1e9 + " seconds"); } } </span>
2:統計指定目錄下所有的*.jar 包中*.class 檔案的程式碼行數,檔案為 JarTotal.java(可單獨執行)
package com.dufy.test; import java.io.BufferedReader; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.URL; import java.util.Enumeration; import java.util.HashSet; import java.util.Set; import java.util.jar.JarEntry; import java.util.jar.JarFile; /** * 統計指定路徑下面jar包檔案中所有*.class 檔案的程式碼行數 * @author aflyun * @date 2016.02.16 * @version 1.0 */ public class JarTotal { //jar包存放的倉庫位置 public static String jarPath = "D:/KuYuPrograms/repository/com/aebiz"; //存放所有的jar的包路徑和名稱 public static Set<String> jarList = new HashSet<String>(); //統計jar包總程式碼行數 public static int countCode = 0; public static int runJarTotal() { try { File filetxtPath = new File("D:/jarFileCount.txt");//輸出要統計的檔案資訊 PrintWriter pw = new PrintWriter(new FileWriter(filetxtPath)); File file = new File(jarPath); findAllJarFiles(file); for (String jarName : jarList) { pw.println(jarName); //將jar檔案寫入txt中 Set<String> findAllJarClassfiles = findAllJarClassfiles(jarName); for (String jarClassFileName : findAllJarClassfiles) { countJarLine(jarName,jarClassFileName); } } pw.println("總共jar檔案數量 :" + jarList.size()); pw.close(); System.err.println("jar包檔案數量 : "+ jarList.size()); System.err.println("jar包中總程式碼行數 : "+ countCode); } catch (Exception e) { // TODO: handle exception } return countCode; } /** * 遍歷獲取所有的jar包檔案路徑和名稱 * @param dir 目標路徑 */ public static void findAllJarFiles(File dir) { try { //獲取當前資料夾下的所有檔案和資料夾 File[] files = dir.listFiles(); for(int i = 0; i < files.length; i++){ // System.out.println(fs[i].getAbsolutePath()); String jspPath = files[i].getAbsolutePath().replace("\\", "/"); if(jspPath.endsWith(".jar")){ //System.out.println(jspPath); jarList.add(jspPath); } //如果是資料夾,遞迴 if(files[i].isDirectory()){ findAllJarFiles(files[i]); } } } catch (Exception e) { System.err.println("獲取所有的jar包路徑和名稱出錯!"); } } /** * 獲取jar包目錄下所有的class檔案 * @param jarName jar包的路徑和名稱 * @return 返回對應jar包下所有.class 檔案的集合 */ public static Set<String> findAllJarClassfiles(String jarName){ //存放jar包下對應的檔案路徑和名稱 Set<String> jarFileList = new HashSet<String>(); try { JarFile jarFile = new JarFile(jarName); Enumeration<JarEntry> entries = jarFile.entries(); while(entries.hasMoreElements()){ JarEntry jarEntry = entries.nextElement(); String fileName = jarEntry.getName(); if(fileName.endsWith(".class")){ //System.out.println(fileName); jarFileList.add(fileName); } } } catch (IOException e) { System.err.println("獲取jar包下的所有class出錯!"); } return jarFileList; } /** * 構造URI/URL格式的檔案路徑<br/> * 統計所有jar包中所有class檔案的程式碼行數 * @param jarName jar包的路徑和名稱 * @param jarClassFileName jar包下所有檔案.class 檔案的路徑和名稱 * @throws IOException */ public static void countJarLine(String jarName,String jarClassFileName) { try { URL url = new URL("jar:file:/"+jarName+"!/"+jarClassFileName+""); //System.out.println(url); InputStream is=url.openStream(); BufferedReader br=new BufferedReader(new InputStreamReader(is)); String line = ""; while((line = br.readLine())!=null){ countCode ++; } } catch (Exception e) { System.err.println("統計jar包總程式碼數出錯!"); } } //==========================================================================================// public static void main(String[] args) throws Exception { long start = System.nanoTime(); runJarTotal(); long end = System.nanoTime(); System.out.print("cost: " + (end - start)/1e9 + " seconds"); } }
3:呼叫1、2中的工具類,統計出 專案中指定路徑下 *.java 和指定jar包中*.class 的總程式碼行數,檔案為 CountTotalMain.java
package com.dufy.test; /** * 統計專案中所有程式碼的行數<br/> * 1: .java檔案中程式碼<br/> * 2: jar包中的檔案程式碼 * @author aflyun * */ public class CountTotalMain { public static void main(String[] args) { long start = System.nanoTime(); int runJavaTotal = JavaTotal.runJavaTotal(); int runJarTotal = JarTotal.runJarTotal(); System.out.println("java總程式碼: " + runJavaTotal +"----jar總程式碼: " + runJarTotal); System.out.println("專案中總程式碼之和為 : " + (runJarTotal + runJavaTotal)); long end = System.nanoTime(); System.out.println("cost: " + (end - start)/1e9 + " seconds"); } }