`
DLevin
  • 浏览: 36896 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

读取Jar文件的部分实现

    博客分类:
  • Tips
 
阅读更多

读取Jar文件的内容可以通过JarInputStream来实现(继承于ZipInputStream)。

Java中通过ZipEntry来表示Jar中的一项。

JarInputStream提供getNextEntry()方法以遍历Jar文件中的每一项。

JarInputStream提供getManifest()方法以获取Manifest中定义的信息。

JarInputStream提供read()方法以读取每一项的内容。

 

具体实现如下:

	private byte[] loadClassData(String name)
	throws ClassNotFoundException {
		JarInputStream jarInputStream = null;
		try {
			jarInputStream = new JarInputStream(new FileInputStream(jarFilename));
		} catch (FileNotFoundException e) {
			throw new ClassNotFoundException(jarFilename + " doesn't exist", e);
		} catch (IOException e) {
			throw new ClassNotFoundException("Reading " + jarFilename + " error", e);
		} 
		
		byte[] classData = null;
		String location = name.replace('.', '/') + ".class";
		while(true) {
			ZipEntry entry = null;
			try {
				entry = jarInputStream.getNextEntry();
				if(entry == null) break;
				
				String entryName = entry.getName();
				if(entryName.toLowerCase().endsWith(".class") && 
						entryName.equals(location)) {
					classData = readClassData(jarInputStream);
				}
				
			} catch(IOException e) {
				System.err.println(e.getMessage());
			}
		}
		
		if(classData == null) {
			throw new ClassNotFoundException(name + " cannot be found");
		}
		
		return classData;
	}
	
	private byte[] readClassData(JarInputStream jarInputStream)
	throws IOException {
		ByteArrayOutputStream classData = new ByteArrayOutputStream();
		int readSize = 0;
		while(jarInputStream.available() != 0) {
			// 注:有些时候,即使jarInputStream有超过BUFFER_SIZE的数据
			//     也有可能读到的数据少于BUFFER_SIZE
			readSize = jarInputStream.read(buffer, 0, BUFFER_SIZE);
			// jarInputStream.available()好像不起作用,因而需要加入一下代码
			if(readSize < 0) break;
			classData.write(buffer, 0, readSize);
		}
		return classData.toByteArray();
	}

 

分享到:
评论

相关推荐

    Excel数据操纵-jar包-jxl.jar

     将下载后的文件解包,得到jxl.jar,放入classpath,安装就完成了。  (很大总是不能很好的加载,我想补充一下:把你下载好的JXL.JAR包放入D:\JAVA\jre\lib\ext中(我的是JDK1.6)就OK了。我相信在配置TOMCAT时也...

    java8rt.jar源码-mini-jvm:Go语言实现的JVM,实现了部分字节码的解释执行,学习JVM使用

    rt.jar源码 Mini-JVM 使用Go实现的Java虚拟机(不完整),解释执行,仅学习JVM使用; Mini-JVM首先会从classpath中加载主类的class文件,然后找到main方法的字节码解释执行;执行过程中如果遇到新的类符号引用,则会...

    jExplorer——SWT做的一个文件浏览器

    2. jar文件没有更新,如果需要打好包的jar文件请等我把功能都实现后的那个版本 - - 尚未实现的功能: 1. 剪切/复制/粘贴功能 2. 拖拽功能 3. 详尽的注释 4. 异常处理 5. 国际化 ################14/12/2007更新#...

    JAVA上百实例源码以及开源项目

    Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密  Java非对称加密源程序代码实例,本例中使用RSA加密技术,...

    用SWT/JFace实现的资源管理器jExplorerV0.5(附源码)

    jar文件没有更新,如果需要打好包的jar文件请等我把功能都实现后的那个版本 - - &lt;br&gt; 尚未实现的功能: 1. 剪切/复制/粘贴功能 2. 拖拽功能 3. 详尽的注释 4. 异常处理 5. 国际化 &lt;br&gt; ...

    基于java实现的数据库管理系统.7z

    相当于把.java编译成了.class,再读取dbf文件,执行实体对dbf文件内容进行相应的操作,相当于 类加载执行,实现sql语句的解析执行的过程。 2.实现了create,insert,update,delete,select,多表查询,排序等简单...

    java源码包---java 源码 大量 实例

    Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密  Java非对称加密源程序代码实例,本例中使用RSA加密技术,...

    word源码java-replace-maven-plugin:替换项目代码不规范部分,不改变源码,实现修改jar中的class文件

    在项目代码的中,在编译之前将java源文件通过流的读取和扫描实现替换,也可以通过pom.xml参数实现 自定义的内容的替换。下面是替换的核心代码: private void replace(String path, String origin, String targin) ...

    java源码包2

    Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密  Java非对称加密源程序代码实例,本例中使用RSA加密技术...

    java源码包3

    Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密  Java非对称加密源程序代码实例,本例中使用RSA加密技术...

    gerber-lib:用于处理Gerber文件的库

    读取端包括以下部分: GerberParser:PEG解析器解析输入并调用GerberParseEventHandler GerberReadAdapter:根据标准将解析事件转换为更高级别的事件。 调用GerberReadEventHandler ...

    java源码包4

    Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密  Java非对称加密源程序代码实例,本例中使用RSA加密技术...

    APDUAnalysiser及Java源代码

    程序仅实现了对文本文件的内容读取和解析,isf文件由于其格式高通未公布,其文件结构属于黑盒状态,暂时无法直接解析。 当前对isf文件的导入方案为:通过QCAT先转化为文本再导入。 当用户选取某个isf文件后,程序...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密 Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密 Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义...

    FireWorkflow工作原理,设计与应用

    fireworkflow配,操作手册,Fire ...引擎读取流程定义文件并解释执行,提供一组对象和相关的API供外部系统调用,如流程实例(ProcessInstance),任务实例(TaskInstance),工单(WorkItem)事件等,org-fireflow-engine.jar

    JAVA上百实例源码以及开源项目源代码

    Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密  Java非对称加密源程序代码实例,本例中使用RSA加密技术,...

    OA高危漏洞利用工具v1.2.0

    使用JDK8启动,命令如下: java -javaagent:Exp-...新增致远帆软报表文件读取-bypass 新增泛微eoffice uploadify上传 新增php-framework和java-framework 新增nacos任意用户添加 新增金蝶云星空反序列化 优化部分代码

    gdpr:Wireshark pcap文件的更新工具,用于匿名显示跟踪中的个人身份数据

    该代码将:- 读取所有数据包在UDP或TCP数据包中找到任何SIP数据包解析所有SIP标头,使原始MSISDN匿名存储更新的SIP数据包非SIP数据包通过未更改的方式复制手术使用要处理的pcap文件的名称运行可执行jar文件。...

Global site tag (gtag.js) - Google Analytics