统计java代码行数和jar包中*.class代码的行数

统计java行数和jar包中代码行数

大家好,又见面了,我是全栈君。

自己写了一个简单的小工具,统计一下指定项目路径下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.net/121281.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • redis数据结构详解之Hash(四)

    redis数据结构详解之Hash(四)

    2021年9月13日
  • 进口跨境电商erp系统_东南亚的电商平台

    进口跨境电商erp系统_东南亚的电商平台【上马ERP】专注东南亚本地电商市场,对接shopeeLazadatokopediaJD.idBilbilAkulaku等电商平台一套根据东南亚本地电商需求深度订制的ERP/WMS仓储系统!上马特色功能:【自动处理pickupGo-jek,Gosend,Grad订单】【自动打印快递面单】:美观、高效、准确、效率【自动更新平台订单】:结合仓库现有库存,自动更新平台库存,100%防止超卖;【智能化仓库管理】:智能生成拣货清单,高效准确管理仓库;【实时校验订…

    2022年9月20日
  • oracle数据库sys密码修改_oracle修改system密码

    oracle数据库sys密码修改_oracle修改system密码Oracle提供两种验证方式,一种是OS验证,另一种密码文件验证方式,如果是第一种方式用以下方法修改密码:sqlplus/assysdbaalterusersysidentifiedby新密码;alterusersystemidentifiedby新密码;如果是第二种方法用以下方法修改密码:orapwdfile=pwdxxx.orapassword=你设定的新密码e…

    2022年7月28日
  • ssm框架过时了吗_Spring Boot

    ssm框架过时了吗_Spring BootSpringSpring是一个开源的免费的框架Spring是一个轻量级的,非入侵式的框架控制反转(IOC),面向切面编程(AOP)支持事务的处理,对框架整合的支持IOC理论UserDaoUserDaoImpUserSeviceUserServiceImp在之前,用户的需求可能会影响原来的代码。使用一个set。public void setUserDao(UserDao userDao){ this.userDao = userDao;}之前是主动创建对象,控制

    2022年8月8日
  • QT QFile「建议收藏」

    QT QFile「建议收藏」QFile类提供了读取和写入文件的接口。QFile是一个读写文本和二进制文件和资源的I/O设备。QFile可以单独使用,或者更方便地与QTextStream或QDataStream一起使用。文件名通常在构造函数中传递,但它可以在任何时候使用setFileName()设置。无论操作系统如何,QFile都希望文件分隔符为“/”。不支持使用其他分隔符(例如’\’)。您可以使用exists()检查文件是否存在,并使用remove()删除文件。(更高级的文件系统相关操作由QFileInfo和QDir提供。

    2022年6月12日
  • 图形推理1000题pdf_小学三年级逻辑推理题,学霸1分钟能做对4题,最后一题难坏家长…[通俗易懂]

    图形推理1000题pdf_小学三年级逻辑推理题,学霸1分钟能做对4题,最后一题难坏家长…[通俗易懂]逻辑推理是考察学生数学逻辑推理能力的重要方法,也是为了进入高年级以后锻炼解析几何和证明题的基础条件之一,一般小学生逻辑推理好的数学成绩都不会差,能够锻炼学生的发散思维能力,帮助快速的找出解题思路。不管是逻辑推理题还是证明题,都是让学生由已知条件解析出未知条件,已知条件里边有很多内在的关联信息,但是需要学生仔细观察,如果找不出内在的关系,这道题十有八九是解不出来的,这种题型不仅学生要善于分析还要懂得…

    2022年9月9日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号