当前位置: 移动技术网 > IT编程>开发语言>Java > 从Java的jar文件中读取数据的方法

从Java的jar文件中读取数据的方法

2019年07月22日  | 移动技术网IT编程  | 我要评论

本文实例讲述了从java的jar文件中读取数据的方法。分享给大家供大家参考。具体如下:

java 档案 (java archive, jar) 文件是基于 java 技术的打包方案。它们允许开发人员把所有相关的内容 (.class、图片、声音和支持文件等) 打包到一个单一的文件中。jar 文件格式支持压缩、身份验证和版本,以及许多其它特性。

从 jar 文件中得到它所包含的文件内容是件棘手的事情,但也不是不可以做到。这篇技巧就将告诉你如何从 jar 文件中取得一个文件。我们会先取得这个 jar 文件中的文件目录,然后读取指定的文件。

如果你熟悉常见的 zip 格式,你会发现 jar 文件和它区别不大。jar 文件提供了一个把多个文件打包到一个文件中的方法,而且被打包的每个文件都可以分别压缩。jar 文件可以添加一个被称为 manifest  的东西,它们允许开发人员添加与内容有关的其它信息。例如,manifest 可以指明由 jar 文件中的哪一个文件开始运行应用程序,或者指定这个库的版本等。

java 2 sdk 标准版提供了一个 jar 工具,你可以通过它在控制台下读写 jar 文件。然后,也许有些时候你想在你的程序中读写 jar 文件。(这篇技巧仅涉及了在程序中读 jar 文件的内容。)非常高兴,你可以做到,并且不需要考虑解压的问题,因为类库已经帮你处理了。你要用到的类都在 java.util.jar 包中。这里要用到的主要的类是 jarfile 类,它是一个 .jar 文件自身的引用。其中的每个文件则由 jarentry 引用。

现在开始,传递一个参数给 jarfile 的构造函数创建一个 jarfile 实例,这个参数可能是 string 也可以是 file,它是一个 .jar 文件的位置:

复制代码 代码如下:
jarfile jarfile = new jarfile("thefile.jar");

或者

复制代码 代码如下:
file file = new file("thefile.jar");
jarfile jarfile = new jarfile(file);

它还有其它一些构造函数,支持身份验证和标记文件为删除。不过这里不会涉及到这些构造函数。

在你得到一个 jar 文件的引用之后,你就可以读了其内容的目录了。jarfile 的 entries 方法返回一个所有条目的 enumeration 对象,你还可以从 manifest 文件中获得它的属性、身份验证信息以及其它的信息,如条目的名称和大小。

// 译者注:enum 在 java 5.0 中是关键字,所以该例在 5.0 中应该编译失败
// 但英文原著发表于 java 5.0 出现之前,所以可以使用 enum 作变量名
// 为忠于原著,这里未作修改
enumeration enum = jarfile.entries();
while (enum.hasmoreelements()) {
  process(enum.nextelement());
}

以前提到过,每个个体都是一个 jarentry。这个类有一些诸如 getname、getsize 和getcompressedsize 的方法。

让我们举例说明如何在程序中使用这些特性。下面的程序显示 jar 文件的内容列表及各项的名称、大小和压缩后的大小。(这很类似于使用带 "t" 和 "v" 参数的 jar 命令。)

import java.io.*;
import java.util.*;
import java.util.jar.*;
public class jardir {
  public static void main (string args[]) 
    throws ioexception {
    if (args.length != 1) {
      system.out.println("please provide a jar filename");
      system.exit(-1);
    }
    jarfile jarfile = new jarfile(args[0]);
    enumeration enum = jarfile.entries();
    while (enum.hasmoreelements()) {
      process(enum.nextelement());
    }
  }
  private static void process(object obj) {
    jarentry entry = (jarentry)obj;
    string name = entry.getname();
    long size = entry.getsize();
    long compressedsize = entry.getcompressedsize();
    system.out.println(name + " " + size + " " + compressedsize);
  }
}

如果你用 j2se 1.4.1 中的 jce.jar 来试验上述的 jardir 程序,你应该看像下面那样的输出 (在 ... 处应该显示更多文件):

meta-inf/manifest.mf  5315  1910
meta-inf/4jcejars.sf  5368  1958
meta-inf/4jcejars.dsa  2207  1503
meta-inf/    0    2
javax/ 0    0
javax/crypto/  0    0
javax/crypto/interfaces/    0    0
javax/crypto/interfaces/dhkey.class   209   185
javax/crypto/interfaces/dhpublickey.class    265   215
javax/crypto/interfaces/dhprivatekey.class   267   215
javax/crypto/interfaces/pbekey.class  268   224
javax/crypto/secretkey.class  167   155
...

注意输入内容顶部包含 meta-inf 的那几行,这是 menifest 和安全验证信息。其中大小为 0 的项不是文件,而是目录。

要真正从 jar 文件中读取文件内容,你必须获得相应条目的 inputstream。这不同于 jarentry。jarentry 仅包括了入口信息,却并未包含实际的内容。这很像 file 和 fileinputsteram 的区别。只访问 file,永远不会打开相应的文件,它只读取在目录中的信息。下面告诉你如何从一个条目得到 inputstream:

复制代码 代码如下:
inputstream input = jarfile.getinputstream(entry);

得到输入流之后,你只需要像读其它流一样读它就行了。如果是一个文本流,要记得使用一个 reader 来从流中获取字符。而对于字节流,如图片,则只好直接读取。

下面的程序演示了从一个 jar 文件中读取内容。运行程序时,需要指定要从 jar 文件中读取的文件名,这个文件必须是文本文件类型。

import java.io.*;
import java.util.jar.*;
public class jarread {
  public static void main (string args[]) 
    throws ioexception {
    if (args.length != 2) {
      system.out.println("please provide a jar filename and file to read");
      system.exit(-1);
    }
    jarfile jarfile = new jarfile(args[0]);
    jarentry entry = jarfile.getjarentry(args[1]);
    inputstream input = jarfile.getinputstream(entry);
    process(input);
    jarfile.close();
  }
  private static void process(inputstream input) 
    throws ioexception {
    inputstreamreader isr = 
      new inputstreamreader(input);
    bufferedreader reader = new bufferedreader(isr);
    string line;
    while ((line = reader.readline()) != null) {
      system.out.println(line);
    }
    reader.close();
  }
}

假设你有一个名为 myfiles.jar 的 jar 文件,其中有一个名为 spider.txt 文本文件,再假设那个  pider.txt 包含如下文本:

the itsy bitsy spider 
ran up the water spout
down came the rain and
washed the spider out 

运行下面的命令以显示 jar 文件中该文本文件的内容:

复制代码 代码如下:
java jarread myfiles.jar spider.txt

希望本文所述对大家的java程序设计有所帮助。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网