多数 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
。随后我们使用JarResources
的getResource()
方法将来自 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库处理Java中的ZIP压缩文件》 在Java开发中,处理ZIP压缩文件是一项常见的任务。zip4j库作为一个强大的工具,为开发者提供了便捷的方法来读取、写入、创建、添加、提取、更新以及从ZIP文件中删除文件,...
Java操作Zip文件主要涉及到对文件和目录的压缩与解压缩,以及在必要时对压缩文件进行加密处理。这里我们重点讨论使用两个库:`zip4j`和`Apache Ant`来实现这些功能。 1. **zip4j库**:`zip4j-1.3.2.jar`是一个用...
首先,`jar`文件是Java档案文件,它是Java平台特有的打包方式,用于收集多个类文件、相关的元数据和资源文件。创建jar文件的主要目的是便于分发和执行Java应用程序或库。`jar`命令是Java开发工具包(JDK)自带的工具,...
这个"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(Java Archive)包是Java平台的一种归档格式,用于集合多个类文件、资源文件和其他元数据。JAR文件通常用于创建可执行程序、库或者部署Java应用程序。它们可以包含manifest文件,提供有关包的信息,...
例如,他们可以在构建脚本中指定要包含在ZIP文件中的文件和目录,或者从ZIP文件中提取特定的资源。 "jar.zip包下载"指的是用户可以从某个源下载这个压缩包,这通常是为了方便开发者在本地环境中使用Ant ZIP任务,而...
本文将深入探讨如何从ZIP、RAR和JAR压缩文件中提取PNG图像,以及相关的技术细节。 首先,让我们了解一下ZIP文件。ZIP是一种常见的文件压缩格式,由Phil Katz在1989年创建。它支持多文件压缩和文件夹结构,方便用户...
从zip文件中创建、添加、提取、更新和删除文件 支持流(ZipInputStream和ZipOutStream) 读/写受密码保护的zip文件和流 支持AES和zip标准加密方法 支持Zip64格式 存储(无压缩)和放气压缩方法 从拆分的zip文件中...
ClassLoader是Java中负责加载类的组件,它知道如何从不同的源(如文件系统、网络或ZIP文件)加载类和资源。 2. **getResource() 和 getResourceAsStream()**: 这两个方法是ClassLoader和类的Class对象提供的。`get...
3. **ffmpeg.jar**: 这是JavaCV对FFmpeg库的Java封装,允许开发者在Java中进行音视频的处理和分析。包括视频的读取、播放、编码、解码、剪辑、转码等功能。 4. **opencv.jar**: OpenCV是一个流行的计算机视觉库,...
6. **PDF合并与拆分**:可以将多个PDF文件合并为一个,或者从PDF文档中提取特定页面。 7. **PDF/A兼容**:支持创建符合PDF/A标准的文档,用于长期归档和合规性要求。 在使用iText时,开发者需要将对应的jar包(如`...
此外,由于OpenCV库是C++编写的,因此在Java中使用时要特别注意异常处理和线程安全问题。 7. **调试与学习资源**:OpenCV官方文档、社区论坛和各种在线教程为学习和解决OpenCV Java问题提供了丰富的资源。开发者...
Java发送邮件是通过JavaMail API实现的,这个过程涉及到几个关键的jar文件,其中最重要的两个就是`javamail.jar`和`activation.jar`。这两个库提供了邮件发送和邮件附件处理的功能,是Java开发者进行电子邮件通信的...
在Java中,可以使用`java.util.zip`包的`ZipInputStream`和`ZipEntry`类,同时设置正确的字符编码,如下所示: ```java import java.io.*; import java.util.zip.*; public class ZipExtractor { public static ...
"abe.jar"是一款专门用于处理AB格式备份文件的工具,它允许用户查看和提取备份文件中的特定应用数据。这个工具的主要功能包括: 1. 解密AB文件:abe.jar能够解析AB文件的加密结构,将其转换为可读的格式。 2. 文件...
Java 归档(JAR)文件是Java平台中用于打包应用程序、库以及资源的重要工具。JAR文件将多个文件合并成一个单一的归档文件,这些文件通常包括`.class`文件(编译后的Java代码)、资源文件(如图片、文本等)、配置...
标题提到的"反编译jar文件,导出java源码 jd-gui 0.3.5 and dex2jar 0.0.9.15 and jar2dex.zip"就是一个这样的场景,它涉及到两个主要的反编译工具:JD-GUI和dex2jar。 **JD-GUI** 是一个直观的图形用户界面工具,...
为了在Java中调用Kettle,首先需要获取相关的jar包。这些jar包通常包含在Kettle的lib目录下,包括`pentaho-kettle`核心库和其他依赖库。确保包含以下关键jar文件: 1. `kettle-engine.jar`: 包含Kettle引擎,用于...
Java中的`java.io`包提供了丰富的类来处理文件操作,如`File`用于文件的基本操作,`FileInputStream`和`FileOutputStream`用于读写文件,以及`BufferedReader`和`BufferedWriter`进行字符流的读写。这个库可能包含...
这个压缩包"java调用Kettle引用jar包2.zip"很可能包含了一些示例代码和必要的库文件,帮助开发者学习如何在Java项目中调用Kettle。 首先,我们需要理解Kettle的核心组件:Job和Transformation。Job是一系列步骤的...