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

从 Java 档案 (JAR) 中读取文件

    博客分类:
  • J2EE
阅读更多

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

  关于 JAR 文件更多的内容,请参阅 JAR file specification

分享到:
评论

相关推荐

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

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

    从jar文档中读取文件

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

    Java源文件读取JAR包文件.rar

    要从JAR文件中读取内容,Java提供了一个内置的`java.util.jar`包,其中包含`JarFile`和`JarEntry`类。以下是一步步实现这个功能的方法: 1. **打开JAR文件**:使用`JarFile`类的构造函数,传入JAR文件的路径。这将...

    详解Java读取Jar中资源文件及示例代码

    Java读取Jar中资源文件是一种常见的操作,通过使用java.util.jar.JarFile和java.util.jar.JarEntry可以实现读取jar文件中的资源文件。这种机制可以实现资源的动态加载和更新,提高了系统的灵活性和可维护性。

    java 读取jar包文件

    在Java编程中,读取jar包内的文件是一个常见的需求,特别是在运行时动态加载资源或类文件时。Java提供了一种内置的方式,通过`java.util.jar`包中的`JarFile`和`JarInputStream`类来实现这个功能。下面将详细介绍...

    java上传文件jar

    在Java开发中,上传文件是一项常见的任务,尤其是在构建Web应用程序时。标题提到的"java上传文件jar"实际上指的是两个关键的Java库,它们是Apache Commons IO和Apache Commons FileUpload。这两个库提供了强大的文件...

    java读JAR包里的配置文件

    java读JAR包里的配置文件、java读JAR包里的配置文件

    JAR文件读取工具

    JD-GUI是Java反编译器的一种,它提供了一个图形用户界面,可以直接打开并查看JAR文件中的源代码。这个1.4.0版本是官方发布的,虽然不是原创代码,但它是经过验证和广泛使用的,可以可靠地将字节码转换回可读的Java源...

    java读取ini文件jar

    运行这个示例,你可以看到如何从 Ini 文件中提取数据并进行操作。确保替换`"path_to_your_ini_file.ini"`为你的 Ini 文件的实际路径。 总的来说,Java通过引入第三方库如Apache Commons Configurations,可以方便地...

    java调用外部jar文件

    2. 创建自定义类加载器,重写`findClass()`方法,从jar文件中读取并加载类。 3. 使用加载的类进行实例化和方法调用。 4. 考虑处理外部jar的依赖关系。 在实际开发中,这种动态加载外部jar文件的能力对于构建可扩展...

    读取分析Excel所有jar包和java示例文件

    本资源包聚焦于这个主题,包含了一系列jar包以及两个.java示例文件,帮助我们深入理解如何在Java环境中读取和解析Excel内容。 首先,让我们了解一下核心的jar包。这些jar包通常包含了用于操作Excel文件的API,例如...

    EXCELJAVA读取JAR包

    标题“EXCELJAVA读取JAR包”涉及的是Java编程中的一个特定应用场景,即使用Java来读取Excel文件,而这个过程可能涉及到从一个JAR文件中操作数据。描述中提到,开发者创建了一个Java项目,引入了Apache POI库(通过...

    java读写hdf5格式文件需要使用的库

    1. 引入依赖:将`hdf5-3.3.2.jar`添加到项目的类路径中,如果是Maven或Gradle项目,需要在构建配置文件中添加对应的依赖。 2. 配置动态链接库:在Java程序启动时,确保操作系统路径包含对应的动态链接库。对于...

    Java读取netcdf文件和生成等值线的jar_netcdf_wContour

    在实际应用中,通常会结合这两个库,先使用netcdf-4.3.22.jar读取NetCDF文件中的科学数据,然后用wContour.jar将其可视化为等值线图。需要注意的是,由于NetCDF文件可能包含多维数据,所以在处理时可能需要对数据...

    spring读取jar中的配置文件

    在`AppProperties`类中,我们可以定义属性的字段,并通过`@ConfigurationProperties`注解指定前缀,Spring Boot会自动从配置文件中匹配并注入值。 为了使Spring Boot能够找到JAR内的配置文件,可以在`src/main/...

    JAVA 读取visio word excel 数据及详细jar使用说明

    2. 类型库导入:使用tlbimp.jar生成对应的Java绑定,例如`tlbimp.exe your_visio_type_library.tlb`,这会生成一个Java接口文件,你可以导入到Java项目中。 3. 创建COM对象:使用com4j提供的API创建对应的应用程序...

    Java —— jar读取自身图片和文本(.txt)文件(含源代码)

    在Java编程中,有时我们需要在运行时从JAR文件中读取资源,如图片和文本文件。这在创建可执行的Java应用程序时尤其常见,因为这些资源通常被打包到JAR文件内部。以下是一个详细的知识点说明,关于如何在Java中读取...

    读取war包或jar包内的文件

    标题"读取war包或jar包内的文件"涉及到的知识点主要是如何在程序中动态地获取并读取这些归档文件中的内容,这对于理解和处理Java应用的部署和运行至关重要。这篇博客(虽然链接未提供具体内容)可能探讨了以下关键点...

    java读取tar.gz压缩文件的jar包

    java读取tar.gz压缩文件的jar包

    Java解析气象数据.nc文件依赖jar包

    Java解析气象数据.nc文件依赖jar包,Java解析气象数据.nc文件依赖jar包

Global site tag (gtag.js) - Google Analytics