`
wtaoli
  • 浏览: 27798 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

从jar文件中提取资源

阅读更多
数 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 文件中的任何资源。
分享到:
评论

相关推荐

    Java实现从jar包中读取指定文件的方法

    在Java编程中,有时我们需要从已经打包的JAR文件中读取特定的资源文件,例如配置文件、图片或库。本篇文章将详细讲解如何在Java中实现从JAR包中读取指定文件的方法。 首先,Java提供了`java.util.jar`包,其中包含...

    从压缩文件中提取png

    总的来说,从ZIP、RAR和JAR文件中提取PNG图像是一项基础的IT技能,涉及到文件系统操作、压缩格式理解和图像处理等多个方面。了解这些知识不仅可以提高工作效率,也有助于理解更复杂的文件管理和数据处理任务。

    JAR文件包及jar命令详解

    在 Java 开发中,JAR(Java Archive)文件是一种常用的归档格式,它允许开发者将多个类文件、资源文件及其他元数据打包到一个单独的文件中。这不仅便于管理,还提高了程序的可移植性。本文将详细介绍 JAR 文件的概念...

    Jar文件转Text文件

    然而,有时我们需要查看或提取JAR文件中的内容,例如查看类文件、资源文件或者配置文件等。这通常是通过专门的工具或命令行工具如Java的`jar`命令来完成。 "Jar文件转Text文件"的软件则提供了一个便捷的解决方案,...

    android动态加载jar文件中的图片

    步骤3:从jar文件中提取图片 一旦获取到`InputStream`,我们可以使用`ZipInputStream`来遍历jar文件的内容。对于每个条目,检查其是否为图片文件(如`.jpg`, `.png`等)。如果是,我们可以使用`BufferedImage`(需要...

    JAR文件包及jar命令详解.rar

    - `jar xf JarName.jar`:提取JAR文件中的所有内容。 - `jar tf JarName.jar`:列出JAR文件中的所有条目。 - `jar cvfe JarName.jar MainClass DirectoryOrFiles`:创建JAR文件并指定主类,用于可执行JAR。 4. *...

    JAR文件详解

    可执行JAR文件是一种特殊的JAR,可以直接由JVM执行,无需设置类路径或提取文件。通过在MANIFEST.MF中指定主类,JAR文件可以变成可执行程序,简化了Java应用程序的发布和执行。 总之,JAR文件是Java开发中的关键组成...

    java中如何打jar包jar文件听说过吗,没有?或者陌生!好,没关系,这就是我们的第一站:打包发布。

    - `-x`:从JAR文件中提取指定文件。 - `-u`:更新现有JAR文件。 - `-v`:显示详细输出。 - `-f`:指定JAR文件的名称。 - `-m`:包含指定的清单文件(Manifest)信息。 - `-0`:仅存储,不使用ZIP压缩。 - `-M`:不...

    lib中的jar lib中的jar包

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

    jar 资源包

    使用`java -jar`命令可以执行JAR文件,其中`-jar`参数告诉JVM从JAR中加载类并执行。如果`MANIFEST.MF`指定了主类,那么这个类将作为程序的起点。 4. **JAR的用途**: - **库文件**:开发者可以创建包含常用功能的...

    读取war包或jar包内的文件

    在WAR包中,通常静态资源位于`WEB-INF/classes`或`WEB-INF/lib`下的JAR文件内;在JAR包中,资源通常与对应的类同级或者在特定的目录下。 4. **相对路径与绝对路径**: 在指定资源路径时,可以使用相对路径(相对于...

    jar文件查看工具

    2. **打开jar文件**: 在工具的界面中选择“打开”或“导入”功能,找到目标`jar`文件。 3. **浏览内容**: 工具会显示`jar`文件的目录结构,用户可以逐层展开查看类文件和资源文件。 4. **搜索和查找**: 使用内置的...

    png图片提取器

    在游戏开发中,开发者为了保护游戏资产或者便于分发,有时会将所有资源打包到一个或多个JAR文件中,这些资源可能包括音频、图片、纹理等。 要使用这个“PNG提取工具.exe”,首先你需要下载并运行它。该工具可能具备...

    jar命令使用示例

    - `x`:从JAR文件中提取文件。 - `t`:列出JAR文件的内容。 ### 二、创建JAR文件 创建新的JAR文件通常使用`c`选项,例如: ```bash jar cvf myapp.jar com/myapp/*.class ``` 这条命令会将`com/myapp`目录下的...

    jclasslib修改jar包里面的class文件包含jar

    在Java开发过程中,有时我们需要对已打包的JAR文件进行修改,例如修复错误、更新类或资源等。`jclasslib`是一款强大的反编译器和字节码查看器,它允许开发者查看并修改JAR文件中的`.class`文件。这篇文章将深入探讨...

    jar - Java 归档工具

    - `-x`: 从JAR文件中提取指定的或所有文件。 - `-f`: 指定要处理的JAR文件。 - `-v`: 输出详细信息到标准错误流。 - `-m`: 使用指定的现有清单文件。 - `-u`: 更新现有JAR文件,添加或修改清单。 - `-C`: 更改命令...

    jar的一些相关文件

    在Java开发环境中,`JAR`(Java Archive)文件是一种重要的打包格式,它将多个类文件、资源文件以及元数据组合在一起,便于管理和分发。本篇将详细讲解`JAR`文件及其在IT领域的应用,特别是与`myEclipse`集成、Excel...

    Java打包成jar文件的视频

    Java打包成jar文件是将Java程序的类文件、资源文件以及相关的配置文件打包成一个可执行的归档文件,这在软件开发中是一项常见的任务。jar(Java Archive)文件不仅方便了代码的分发和存储,还能提高程序的运行效率,...

    jar解析工具.rar

    这些工具可以帮助开发者检查类依赖、提取资源或调试问题。 4. **命令行工具**: Java SDK自带了`jar`命令行工具,可以用于创建、更新和提取JAR文件。例如,`jar tf jar_file.jar`可以列出JAR内的所有文件和目录。 ...

    文件上传所需要的jar包

    在你提到的资源中,有两个关键的jar包:`commons-fileupload-1.2.1.jar` 和 `commons-io-1.4.jar`。这两个jar包是Apache Commons项目的一部分,它们提供了强大的文件上传处理能力。 **Apache Commons FileUpload** ...

Global site tag (gtag.js) - Google Analytics