大家好,又见面了,我是全栈君。
自己写了一个简单的小工具,统计一下指定项目路径下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");
}
}
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/121281.html原文链接:https://javaforall.cn