`
DLevin
  • 浏览: 37823 次
  • 性别: 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();
	}

 

分享到:
评论

相关推荐

    JAR文件读取工具

    **JAR文件读取工具详解** Java Archive (JAR) 文件是Java平台上的一个重要组成部分,它主要用于打包Java类、资源文件以及元数据。JAR文件的出现使得Java开发者能够将多个类文件组合成一个单一的可执行文件,方便...

    Eclipse打包成JAR包读取外部JAR包和外部配置文件

    在`Library handling`部分,点击`Add Jars...`或`Add External Jars...`,将需要的JAR文件添加进来,比如压缩包中的`myUtil.jar`。这样,JAR文件就会被正确地打包到`lib`目录下。 接下来是处理外部配置文件。通常,...

    删除jar包中的指定文件

    1. **解压JAR文件**:首先,你需要使用Java的`JarFile`和`InputStream`等类来读取JAR文件,并用`ZipOutputStream`将内容解压到临时目录。 2. **定位并删除目标文件**:遍历解压后的文件系统,找到需要删除的文件,...

    文件上传jar文件

    "文件上传jar文件"这个标题指出,我们讨论的是一个包含用于实现文件上传功能的Java库的压缩包。这个压缩包内含了`fileupload.jar`, `commons-io.jar`, 和 `commons-collections.jar`这三个关键的Java档案(JAR)文件...

    替换jar包包名的jar以及rule规则文件

    这个工具的工作原理是读取用户定义的规则,然后按照这些规则对原始JAR文件中的类进行操作,最终生成一个新的JAR文件。`jarjar`的使用通常涉及以下几个步骤: 1. **编写规则文件**:`rule.txt`就是这样的规则文件,...

    Java实现Excel读写的poi 5.2.1版本jar

    在实际应用中,Java程序员可以使用这些JAR文件来实现如数据导入导出、报表生成、数据分析等多种功能。例如,通过使用POI库,你可以创建一个新的Excel工作簿,添加工作表,插入数据,设置单元格样式,应用公式,甚至...

    Android 实现读写U盘文件

    在build.gradle文件的dependencies部分添加如下依赖: ```groovy implementation 'com.github.seanjohnson044:libaums:0.7.1' ``` 接下来,确保你的Android设备支持USB OTG(On-The-Go),这样可以将U盘连接到手机。...

    Android端上传文件的jar包

    而“Android端上传文件的jar包”则可能是一个包含了实现此类功能的预编译Java类库,方便开发者快速集成到自己的项目中。 这个jar包可能包含以下关键知识点: 1. **网络请求库**:上传文件通常需要一个网络请求库来...

    官方jar文件

    "官方jar文件"通常指的是由软件开发者或官方团队发布的,经过验证和测试的JAR包,它们通常包含了某个特定版本的库或应用程序的完整代码。 在Java开发中,JAR文件扮演了多种角色: 1. **代码打包与分发**:开发者...

    用到的jar包和js文件

    在文件上传和下载的场景中,Commons IO可以帮助我们完成文件的读写、复制、移动、检查等操作。例如,`FileUtils`类提供了便捷的方法来操作文件,如`copyFile()`用于文件复制,`moveFile()`用于文件移动,而`...

    lib中的jar lib中的jar包

    jar文件的结构** `jar`文件是一个压缩格式,内部包含了一组按照特定目录结构排列的`.class`文件和其他资源文件。每个`.class`文件代表了一个Java类或接口。`META-INF`目录通常会包含`MANIFEST.MF`文件,它包含了...

    文件上传所需要的jar

    为了实现文件上传功能,你需要在项目的类路径中包含这两个jar文件,然后按照以下步骤进行操作: 1. 创建`DiskFileItemFactory`实例。 2. 使用`DiskFileItemFactory`创建`ServletFileUpload`实例。 3. 检查请求是否为...

    txt文本文件转换成jar文件

    在Java项目中,这可以通过使用Java的内置类如`java.util.jar.JarFile`和`java.nio.file.Files`来实现对.jar文件的读取操作。 总之,从.txt到.jar的转换是一个实用的技巧,它允许我们把文本数据整合到Java应用中。...

    Java读取netcdf文件和生成等值线的jar_netcdf_wContour

    本篇文章将重点讲解如何使用Java读取NetCDF文件以及生成等值线的实现方法,主要涉及两个关键库:netcdf-4.3.22.jar和wContour.jar。 首先,`netcdf-4.3.22.jar`是Unidata开发的Java NetCDF库,它提供了全面的功能来...

    ssm实现文件上传jar包

    本篇文章将详细探讨如何使用SSM来实现文件上传,并关注提供的两个jar包——`commons-io-2.4.jar`和`commons-fileupload-1.2.2.jar`的作用。 1. **文件上传基本流程** 文件上传通常涉及以下几个步骤: - 前端创建...

    Java读取Excel文件jar包

    注意,poi-3.7-20101029.jar包含了HSSF和XSSF的实现,而poi-ooxml-3.7-20101029.jar则提供了对Office Open XML(OOXML)标准的支持,这对于处理xlsx文件是必需的。 综上所述,通过引入opencsv-2.3.jar、poi-3.7-...

    jar文件

    JAR文件的扩展名为.jar,其本质是一个采用ZIP压缩格式的文件集合,这有助于减少网络传输时间和磁盘空间占用。 在Java开发中,JDOM和DOM4J是两个常见的XML处理库,它们允许开发者以对象模型的方式解析、创建和操作...

    java实现ftp上传jar包

    在这个过程中,我们需要使用Java编程语言,结合FTP(File Transfer Protocol)协议来实现在服务器上上传JAR文件。以下是一些相关的知识点: 1. **FTP协议**:FTP是一种用于在网络上进行文件传输的应用层协议。它...

    上传文件所需jar包

    通过这个接口,开发者可以方便地读取、写入或保存上传的文件。 其次,`commons-io-1.4.jar`是Apache Commons IO库的一个较旧版本,但它仍然包含了处理各种I/O操作的基本工具。在文件上传过程中,Commons IO库提供了...

    java读写hdf5格式文件需要使用的库

    这里提供的jar文件`hdf5-3.3.2.jar`是Java接口库,它封装了对HDF5文件的操作,使得Java程序员可以通过调用Java API来实现读写HDF5文件。而`libjhdf.so.3.2.1`和`jhdf5.dll`分别是Linux和Windows平台的动态链接库,...

Global site tag (gtag.js) - Google Analytics