1. 程式人生 > >統計java程式碼行數和jar包中*.class程式碼的行數

統計java程式碼行數和jar包中*.class程式碼的行數

自己寫了一個簡單的小工具,統計一下指定專案路徑下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");
	}
}