`
JAVA海洋
  • 浏览: 618048 次
  • 性别: Icon_minigender_1
  • 来自: 太原
社区版块
存档分类
最新评论

从JAR和zip档案文件中提取Java 资源

阅读更多

多数 java 程序员都非常清楚使用 jar 文件将组成 java 解决方案的各种资源(即 .class 文件、声音和图像)打包的优点。刚开始使用 jar 文件的人常问的一个问题是:“如何从 jar 文件中提取图像呢?”本文将回答这个问题,并会提供一个类,这个类使从 jar 文件中提取任何资源变得非常简单!

加载 gif 图像
假定我们有一个 jar 文件,其中包含我们的应用程序要使用的一组 .gif 图像。下面就是使用 JarResources 访问 jar 文件中的图像文件的方法:
JarResources JR=new JarResources("GifBundle.jar");

Image logo=Toolkit.getDefaultToolkit().createImage(JR.getResources("logo.gif"));

这段代码说明我们可以创建一个JarResources对象,并将其初始化为包含我们要使用的资源的 jar 文件 -- images.jar。随后我们使用JarResourcesgetResource()方法将来自 logo.gif 文件的原始数据提供给 awt Toolkit createImage()方法。
命名说明
JarResource
是一个非常简单的示例,它说明了如何使用 java 所提供的各种功能来处理 jar zip 档案文件。

工作方式
JarReources类的重要数据域用来跟踪和存储指定 jar 文件的内容:
public final class JarResources {

public boolean debugon=false;

private Hashtable htsizes=new Hashtable();
private Hashtable htjarcontents=new Hashtable();

private String jarfilename;

这样,该类的实例化设置 jar 文件的名称,然后转到init()方法完成全部实际工作。
public JarResources(String jarfilename) {
this.jarfilename=jarfilename;
init();
}

现在,init()方法只将指定 jar 文件的整个内容加载到一个 hashtable(通过资源名访问)中。

这是一个相当有用的方法,下面我们对它作进一步的分析。ZipFile类为我们提供了对 jar/zip 档案头信息的基本访问方法。这类似于文件系统中的目录信息。下面我们列出ZipFile中的所有条目,并用档案中每个资源的大小添充 htsizes hashtable
private void init() {
 try {
 // extracts just sizes only. 
ZipFile zf=new ZipFile(jarFileName);
 Enumeration e=zf.entries();
 while (e.hasMoreElements()) {
 ZipEntry ze=(ZipEntry)e.nextElement();
 if (debugOn) {
 System.out.println(dumpZipEntry(ze));
 }
 htSizes.put(ze.getName(),new Integer((int)ze.getSize()));
 }
 zf.close();
接下来,我们使用ZipInputStream类访问档案。ZipInputStream类完成了全部魔术,允许我们单独读取档案中的每个资源。我们从档案中读取组成每个资源的精确字节数,并将其存储在 htjarcontents hashtable 中,您可以通过资源名访问这些数据:
 // extract resources and put them into the hashtable.
 FileInputStream fis=new FileInputStream(jarFileName);
 BufferedInputStream bis=new BufferedInputStream(fis);
 ZipInputStream zis=new ZipInputStream(bis);
 ZipEntry ze=null;
 while ((ze=zis.getNextEntry())!=null) {
 if (ze.isDirectory()) {
 continue;////啊哟!没有处理子目录中的资源啊
 }
 if (debugOn) {
 System.out.println(
 "ze.getName()="+ze.getName()+","+"getSize()="+ze.getSize()
 );
 }
 int size=(int)ze.getSize();
 // -1 means unknown size. 
if (size==-1) {
 size=((Integer)htSizes.get(ze.getName())).intValue();
 }
 byte[] b=new byte[(int)size];
 int rb=0;
 int chunk=0;
while (((int)size - rb) > 0) {
 chunk=zis.read(b,rb,(int)size - rb);
 if (chunk==-1) {
 break;
 }
 rb+=chunk;
 }
 // add to internal resource hashtable
 htJarContents.put(ze.getName(),b);
 if (debugOn) {
 System.out.println(
 ze.getName()+"rb="+rb+
 ",size="+size+
 ",csize="+ze.getCompressedSize()
 );
 }
 }
 } catch (NullPointerException e) {
 System.out.println("done.");
 } catch (FileNotFoundException e) {
 e.printStackTrace();
 } catch (IOException e) {
 e.printStackTrace();
 }
 }
请注意,用来标识每个资源的名称是档案中资源的限定路径名,例如,不是包中的类名 -- java.util.zip 包中的ZipEntry类将被命名为 "java/util/zip/ZipEntry",而不是 "java.util.zip.ZipEntry"

其它方法:
 /**
 * Dumps a zip entry into a string.
 * @param ze a ZipEntry
 */
 private String dumpZipEntry(ZipEntry ze) {
 StringBuffer sb=new StringBuffer();
 if (ze.isDirectory()) {
 sb.append("d "); 
} else {
 sb.append("f "); 
}
 if (ze.getMethod()==ZipEntry.STORED) {
 sb.append("stored "); 
} else {
 sb.append("defalted ");
 }
 sb.append(ze.getName());
 sb.append("\t");
 sb.append(""+ze.getSize());
 if (ze.getMethod()==ZipEntry.DEFLATED) {
 sb.append("/"+ze.getCompressedSize());
 }
 return (sb.toString());
 }

/**
 * Extracts a jar resource as a blob.
 * @param name a resource name.
 */
 public byte[] getResource(String name) {
 return (byte[])htJarContents.get(name);
 }
 
代码的最后一个重要部分是简单的测试驱动程序。该测试驱动程序是一个简单的应用程序,它接收 jar/zip 档案名和资源名。它试图发现档案中的资源文件,然后将成功或失败的消息报告出来:
public static void main(String[] args) throws IOException {
 if (args.length!=2) {
 System.err.println(
 "usage: java JarResources < jar file name> < resource name>"
 );
 System.exit(1);
 }
 JarResources jr=new JarResources(args[0]);
 byte[] buff=jr.getResource(args[1]);
 if (buff==null) {
 System.out.println("Could not find "+args[1]+".");
 } else {
 System.out.println("Found "+args[1]+ " (length="+buff.length+").");
 }
 }
} // End of JarResources class.
您已了解了这个类。一个易于使用的类,它隐藏了使用打包在 jar 文件中的资源的全部棘手问题。
小结
如果您曾经渴望知道如何从 jar 文件中提取图像,那么您现在已学到了一种方法。有了本技巧提供的这个新类,您就不仅可以用 jar 文件处理图像,而且可以将提取魔术用于 jar 文件中的任何资源。
分享到:
评论

相关推荐

    zip4j-1.3.2.jar 包下载,处理zip压缩文件的开发包

    《使用zip4j库处理Java中的ZIP压缩文件》 在Java开发中,处理ZIP压缩文件是一项常见的任务。zip4j库作为一个强大的工具,为开发者提供了便捷的方法来读取、写入、创建、添加、提取、更新以及从ZIP文件中删除文件,...

    java 操作Zip文件(压缩、解压、加密).zip

    Java操作Zip文件主要涉及到对文件和目录的压缩与解压缩,以及在必要时对压缩文件进行加密处理。这里我们重点讨论使用两个库:`zip4j`和`Apache Ant`来实现这些功能。 1. **zip4j库**:`zip4j-1.3.2.jar`是一个用...

    JAVA 打包(jar\tar\zip)源码

    首先,`jar`文件是Java档案文件,它是Java平台特有的打包方式,用于收集多个类文件、相关的元数据和资源文件。创建jar文件的主要目的是便于分发和执行Java应用程序或库。`jar`命令是Java开发工具包(JDK)自带的工具,...

    java-sdk-4.11.0.jar.zip

    这个"java-sdk-4.11.0.jar.zip"文件是一个包含Java SDK 4.11.0版本的压缩包,其中的核心部分是"java-sdk-4.11.0.jar"文件,它是一个Java归档(JAR)文件,集成了Java开发工具和库。 Java SDK主要包含以下几个关键...

    java jar包 ZIp压缩解压 数据库连接驱动 XML解析

    首先,Java JAR(Java Archive)包是Java平台的一种归档格式,用于集合多个类文件、资源文件和其他元数据。JAR文件通常用于创建可执行程序、库或者部署Java应用程序。它们可以包含manifest文件,提供有关包的信息,...

    ant-zip-1.7.1.jar.zip

    例如,他们可以在构建脚本中指定要包含在ZIP文件中的文件和目录,或者从ZIP文件中提取特定的资源。 "jar.zip包下载"指的是用户可以从某个源下载这个压缩包,这通常是为了方便开发者在本地环境中使用Ant ZIP任务,而...

    从压缩文件中提取png

    本文将深入探讨如何从ZIP、RAR和JAR压缩文件中提取PNG图像,以及相关的技术细节。 首先,让我们了解一下ZIP文件。ZIP是一种常见的文件压缩格式,由Phil Katz在1989年创建。它支持多文件压缩和文件夹结构,方便用户...

    zip4j.jar包下载 包含zip4j-2.9.0版本和zip4j-1.3.1版本的j两个jar包,亲试均可用

    从zip文件中创建、添加、提取、更新和删除文件 支持流(ZipInputStream和ZipOutStream) 读/写受密码保护的zip文件和流 支持AES和zip标准加密方法 支持Zip64格式 存储(无压缩)和放气压缩方法 从拆分的zip文件中...

    读取war包或jar包内的文件

    ClassLoader是Java中负责加载类的组件,它知道如何从不同的源(如文件系统、网络或ZIP文件)加载类和资源。 2. **getResource() 和 getResourceAsStream()**: 这两个方法是ClassLoader和类的Class对象提供的。`get...

    JavaCV-ffmpeg-6大JAR包.zip

    3. **ffmpeg.jar**: 这是JavaCV对FFmpeg库的Java封装,允许开发者在Java中进行音视频的处理和分析。包括视频的读取、播放、编码、解码、剪辑、转码等功能。 4. **opencv.jar**: OpenCV是一个流行的计算机视觉库,...

    pdf工具的jar包 itext.zip 用于Java开发

    6. **PDF合并与拆分**:可以将多个PDF文件合并为一个,或者从PDF文档中提取特定页面。 7. **PDF/A兼容**:支持创建符合PDF/A标准的文档,用于长期归档和合规性要求。 在使用iText时,开发者需要将对应的jar包(如`...

    opencv_java-jar&dll.zip

    此外,由于OpenCV库是C++编写的,因此在Java中使用时要特别注意异常处理和线程安全问题。 7. **调试与学习资源**:OpenCV官方文档、社区论坛和各种在线教程为学习和解决OpenCV Java问题提供了丰富的资源。开发者...

    java发送邮件所需要的jar.zip

    Java发送邮件是通过JavaMail API实现的,这个过程涉及到几个关键的jar文件,其中最重要的两个就是`javamail.jar`和`activation.jar`。这两个库提供了邮件发送和邮件附件处理的功能,是Java开发者进行电子邮件通信的...

    解压jar,zip,压缩支持中文zip

    在Java中,可以使用`java.util.zip`包的`ZipInputStream`和`ZipEntry`类,同时设置正确的字符编码,如下所示: ```java import java.io.*; import java.util.zip.*; public class ZipExtractor { public static ...

    abe.jar android备份文件提取工具

    "abe.jar"是一款专门用于处理AB格式备份文件的工具,它允许用户查看和提取备份文件中的特定应用数据。这个工具的主要功能包括: 1. 解密AB文件:abe.jar能够解析AB文件的加密结构,将其转换为可读的格式。 2. 文件...

    jar - Java 归档工具

    Java 归档(JAR)文件是Java平台中用于打包应用程序、库以及资源的重要工具。JAR文件将多个文件合并成一个单一的归档文件,这些文件通常包括`.class`文件(编译后的Java代码)、资源文件(如图片、文本等)、配置...

    反编译jar文件,导出java源码 jd-gui 0.3.5 and dex2jar 0.0.9.15 and jar2dex.zip

    标题提到的"反编译jar文件,导出java源码 jd-gui 0.3.5 and dex2jar 0.0.9.15 and jar2dex.zip"就是一个这样的场景,它涉及到两个主要的反编译工具:JD-GUI和dex2jar。 **JD-GUI** 是一个直观的图形用户界面工具,...

    java调用Kettle引用jar包.zip

    为了在Java中调用Kettle,首先需要获取相关的jar包。这些jar包通常包含在Kettle的lib目录下,包括`pentaho-kettle`核心库和其他依赖库。确保包含以下关键jar文件: 1. `kettle-engine.jar`: 包含Kettle引擎,用于...

    java常见操作jar库.zip

    Java中的`java.io`包提供了丰富的类来处理文件操作,如`File`用于文件的基本操作,`FileInputStream`和`FileOutputStream`用于读写文件,以及`BufferedReader`和`BufferedWriter`进行字符流的读写。这个库可能包含...

    java调用Kettle引用jar包2.zip

    这个压缩包"java调用Kettle引用jar包2.zip"很可能包含了一些示例代码和必要的库文件,帮助开发者学习如何在Java项目中调用Kettle。 首先,我们需要理解Kettle的核心组件:Job和Transformation。Job是一系列步骤的...

Global site tag (gtag.js) - Google Analytics