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

本文实例讲述了从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程序设计有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, jar
读取数据
java jar读取配置文件、java读取excel jar包、java读取jar包文件夹、java读取jar外部文件、java 读取jar中的文件,以便于您获取更多的相关知识。

时间: 2024-10-01 04:06:02

从Java的jar文件中读取数据的方法_java的相关文章

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

  这篇文章主要介绍了从Java的jar文件中读取数据的方法,实例分析了java档案文件的相关操作技巧,需要的朋友可以参考下 本文实例讲述了从Java的jar文件中读取数据的方法.分享给大家供大家参考.具体如下: Java 档案 (Java Archive, JAR) 文件是基于 Java 技术的打包方案.它们允许开发人员把所有相关的内容 (.class.图片.声音和支持文件等) 打包到一个单一的文件中.JAR 文件格式支持压缩.身份验证和版本,以及许多其它特性. 从 JAR 文件中得到它所包含

试图用java从excel文件中读取数据时出现的问题

问题描述 试图用java从excel文件中读取数据时出现的问题 org.apache.poi.POIXMLException: org.apache.poi.openxml4j.exceptions.InvalidFormatException: OPC Compliance error [M4.1]: there is more than one core properties relationship in the package ! at org.apache.poi.util.Packa

Java将对象保存到文件中/从文件中读取对象的方法_java

1.保存对象到文件中 Java语言只能将实现了Serializable接口的类的对象保存到文件中,利用如下方法即可: public static void writeObjectToFile(Object obj) { File file =new File("test.dat"); FileOutputStream out; try { out = new FileOutputStream(file); ObjectOutputStream objOut=new ObjectOutp

android-小白请教高手问题,今天看了持久化技术的关于一个从文件中读取数据的问题

问题描述 小白请教高手问题,今天看了持久化技术的关于一个从文件中读取数据的问题 想要完成一个功能,向EditText里输入数据,数据存放在一个文件夹后,然后按下back键,再重新启动这个程序,再从这个文件里读取数据,出现的是这个数据已经填充在EditText里 下面是代码 MainActivity import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import

c++的问题-C++中的从文件中读取数据并用链表创建的问题,请帮我看一下我的代码在哪里出现了问题

问题描述 C++中的从文件中读取数据并用链表创建的问题,请帮我看一下我的代码在哪里出现了问题 Phone* creat() { ifstream file("Phone.txt"); if( !file ) { for( int i = 0 ; i < 7; i++ ) cout< cout cout system("pause"); system("cls"); } next=NULL; Phone *pNew,*head,*q;

c-求大神指点怎样从文件中读取数据!!

问题描述 求大神指点怎样从文件中读取数据!! int main() { double data; FILE *fp=fopen("e://in.txt","r"); if(!fp) { printf("can't open file "); return -1; } while(!feof(fp)) { fscanf(fp,"sfdf =%lf",&data); printf("%lf",data)

r语言-(错误在哪里)R语言如何从文件中读取数据

问题描述 (错误在哪里)R语言如何从文件中读取数据 file.choose() [1] "C:UsersHPDesktop新建文件夹data.txt" data1<-read.table("data.txt",header=T) 错误于make.names(col.names, unique = TRUE) : ''多字节字符串有错 data1<-read.table("data.txt",header=T,quote = FALSE

javascript jquery-jquery中getScript()的用法详解,从一个远程js文件中读取数据

问题描述 jquery中getScript()的用法详解,从一个远程js文件中读取数据 第一个html文件: <html> <head> <script type="text/javascript" src="jquery-2.1.3.js"></script> $.getScript("shuj.js",function(){alert("aaaaa");}) </hea

fgets-如何没从一个txt文件中读取数据,然后将这条从txt文件中删除

问题描述 如何没从一个txt文件中读取数据,然后将这条从txt文件中删除 就是用于post的模块,从txt中读取一行post信息之后将它post出去,如果post成功,就将它从日志txt中删除. 感觉这个读取还好说,一行用fgets拉出来就可以post了吧 但是这个删除该如何是好 这就是一个起到日志作用的txt,如果可以Post的情况就一条一条post出去,不可以就存进来,大家来给我一点意见吧 解决方案 从一个txt文件中读取矩阵从一个txt文件中读取矩阵从oracle中读取数据并保存在txt文