知识大全 从JAR和zip档案文件中提取Java资源

Posted 文件

篇首语:私心胜者,可以灭公。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 从JAR和zip档案文件中提取Java资源相关的知识,希望对你有一定的参考价值。

从JAR和zip档案文件中提取Java资源  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

   加载 GIF 图像  假定我们有一个 JAR 文件 其中包含我们的应用程序要使用的一组 gif 图像 下面就是使用 JarResources 访问 JAR 文件中的图像文件的方法     JarResources jar = new JarResources ( Images jar );  Image logo =  Toolkit getDefaultToolkit() createImage (jar getResource ( logo gif );      这段代码说明我们可以创建一个 JarResources 对象 并将其初始化为包含我们要使用的资源的 JAR 文件 Images jar 随后我们使用 JarResources 的 getResource() 方法将来自 logo gif 文件的原始数据提供给 AWT Toolkit 的 createImage() 方法      命名说明  JarResource 是一个非常简单的示例 它说明了如何使用 Java 所提供的各种功能来处理 JAR 和 zip 档案文件     关于命名的简要说明 Java 中的归档支持实际上是以流行的 zip 归档格式为起点的(请参阅 Java Tip : Use archive files to speed up applet loading ) 因此 在最初实现处理档案文件的 Java 支持时 所有类文件以及诸如此类的东西并未放在 java util zip 包中 这些类通常以 Zip 开头 但在转向 Java 时 功能已发生了变化 档案文件的名称也更具有 Java 特征 因此 现在我们称之为 JAR 文件的文件基本上是 zip 文件      工作方式  JarResources 类的重要数据域用来跟踪和存储指定 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   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 中 您可以通过资源名访问这些数据     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();  // 表示大小未知   if (size== )   size=((Integer)htSizes get(ze getName())) intValue();    byte[] b=new byte[(int)size];  int rb= ;  int chunk= ;  while (((int)size rb) > )   chunk=zis read(b rb (int)size rb);  if (chunk== )   break;    rb+=chunk;    // 添加到内部资源 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     代码的最后一个重要部分是简单的测试驱动程序 该测试驱动程序是一个简单的应用程序 它接收 JAR/zip 档案名和资源名 它试图发现档案中的资源文件 然后将成功或失败的消息报告出来     public static void main(String[] args) throws IOException   if (args length!= )   System err println(   usage: java JarResources   );  System exit( );    JarResources jr=new JarResources(args[ ]);  byte[] buff=jr getResource(args[ ]);  if (buff==null)   System out println( Could not find +args[ ]+ );   else   System out println( Found +args[ ]+ (length= +buff length+ ) );         // JarResources 类结束     您已了解了这个类 一个易于使用的类 它隐藏了使用打包在 JAR 文件中的资源的全部棘手问题      练习  现在您对从档案文件中提取资源已有了一定的认识 下面是可用来修改和扩展 JarResources 类的一些说明     不在构造期间一次性加载全部内容 而要延迟加载 对于大型 JAR 文件 构造期间可能没有足够的内存加载全部文件     不只是提供类似 getResource() 这样的一般读方法 我们还可提供资源特定的读方法 例如 用来返回 Java Image 对象的 getImage() 方法 用来返回 Java Class 对象的 getClass() 方法(在自定义的类加载程序的协助下) 等等 如果 JAR 文件足够小 则我们可以根据它们的扩展名( gif class 等等)预先构建全部资源     某些方法应该提供关于给定 JAR 文件本身(基本上是 ZipFile 的包装)的信息 包括 Jar/zip 的条目数 返回全部资源名的 Enumerator 返回特定条目长度(和其他属性)的读方法 允许编制索引的读方法 这仅仅是举几个例子     可对 JarResources 进行扩展 以供 applet 使用 通过利用 applet 参数和 URLConnection 类 就可以从网络上下载 JAR 内容 而不是将档案作为本地文件打开 此外 我们还可将该类扩展为一个自定义的 Java 内容处理程序      小结  如果您曾经渴望知道如何从 JAR 文件中提取图像 那么您现在已学到了一种方法 有了本技巧提供的这个新类 您就不仅可以用 JAR 文件处理图像 而且可以将提取魔术用于 JAR 文件中的任何资源 cha138/Article/program/Java/JSP/201311/19350

相关参考

知识大全 如何在Applet中引用jar中的资源文件

技巧:如何在Applet中引用jar中的资源文件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 从JAR文件中读取文件

从JAR文件中读取文件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!      作者JohnZuk

知识大全 用JAVA解压ZIP

用JAVA解压ZIP  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  关于解压ZIP文件的类解决了

知识大全 程序内部剖析——JAR 文件揭密

程序内部剖析——JAR文件揭密  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  大多数Java程序

知识大全 访问JAR和JAD文件中的属性

访问JAR和JAD文件中的属性  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  MIDIet能够访

知识大全 为什么下载的档案为PDF格式却是压缩档案,双击后为ZIP格式,怎么也打不开

为什么下载的档案为PDF格式却是压缩档案,双击后为ZIP格式,怎么也打不开?  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让

知识大全 如何在java中操作word

  想用java操作word文件?jacob是个不错的选择也就是java桥你可以在project/下载我下载的版本是注意版本太低的话可能会报错  如果没有特殊需求可以直接使用jacob_*zip中提供

知识大全 文件夹压缩到zip以及解压

  需要用到SharpLibZip代码如下  Zipcs  publicclassZip    ///<summary>  ///压缩文件夹  ///</summary>  /

知识大全 利用Java实现zip压缩/解压缩(1)

利用Java实现zip压缩/解压缩(1)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  由于网络

知识大全 java 实现压缩与解压缩ZIP

java实现压缩与解压缩ZIP  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!压缩的import&n