模块 java.base

类 JarFile

所有已实现的接口:
Closeable , AutoCloseable

public class JarFile extends ZipFile
JarFile 类用于从可使用 java.io.RandomAccessFile 打开的任何文件中读取 jar 文件的内容。它扩展了类 java.util.zip.ZipFile,支持读取可选的 Manifest 条目,并支持处理多版本 jar 文件。 Manifest 可用于指定有关 jar 文件及其条目的元信息。

多版本 jar 文件 是一个 jar 文件,其中包含一个名为“Multi-Release”的主要属性的清单,一组“基本”条目,其中一些是具有公共或受保护方法的公共类,这些方法构成了 jar 文件的公共接口,并且“META-INF/versions”目录的子目录中包含的一组“版本化”条目。版本条目按 Java 平台的主要版本划分。 “META-INF/versions/{n}”目录中版本为 n8 < n 的条目覆盖基本条目以及版本号为 i 的任何条目,其中 8 < i < n

默认情况下,多版本 jar 文件的 JarFile 配置为处理多版本 jar 文件,就好像它是普通(未版本化)jar 文件一样,因此条目名称最多与一个基本条目相关联。 JarFile 可以配置为通过使用 JarFile(File, boolean, int, Runtime.Version) 构造函数创建 JarFile 来处理多版本 jar 文件。 Runtime.Version 对象设置搜索版本化条目时使用的最大版本。如此配置后,条目名称最多可以对应一个基本条目和零个或多个版本化条目。需要进行搜索以将条目名称与版本小于或等于最大版本的最新版本条目相关联(请参阅 getEntry(String) )。

利用 JarFileJarFile 条目的内容加载类的类加载器应该通过调用 JarFile(File, boolean, int, Runtime.Version) 构造函数来构造 JarFile 并将值 Runtime.version() 分配给最后一个参数。这可确保从多版本 jar 文件加载与正在运行的 JVM 的主要版本兼容的类。

如果在打开签名的 jar 文件时打开了 verify 标志,则会根据与其 path name 关联的清单中嵌入的签名验证 jar 条目的内容。对于多版本 jar 文件,版本化条目的内容根据其自己的签名进行验证,JarEntry.getCodeSigners() 返回其自己的签名者。请注意,验证过程不包括验证签名者的证书。调用者应检查 JarEntry.getCodeSigners() 的返回值以进一步确定签名是否可信。

除非另有说明,否则将 null 参数传递给此类中的构造函数或方法将导致抛出 NullPointerException

实现注意事项:
如果 API 不能用于配置 JarFile(例如覆盖已编译应用程序或库的配置),则有两个 System 属性可用。
  • jdk.util.jar.version 可以分配一个值,该值是非负整数 <= Runtime.version().feature()String 表示形式。该值用于将有效运行时版本设置为除通过评估 Runtime.version().feature() 获得的默认值之外的其他值。有效的运行时版本是 JarFile(File, boolean, int, Runtime.Version) 构造函数在最后一个参数的值为 JarFile.runtimeVersion() 时使用的版本。
  • jdk.util.jar.enableMultiRelease 可以分配三个 String 值之一 truefalseforce 。默认值 true 启用多版本 jar 文件处理。值 false 禁用多版本 jar 处理,忽略“多版本”清单属性,以及多版本 jar 文件中的版本化目录(如果存在)。此外,方法 isMultiRelease() 返回 false 。值 force 导致 JarFile 在构造后被初始化为运行时版本控制。它实际上与此代码相同:(new JarFile(File, boolean, int, JarFile.runtimeVersion())
自从:
1.2
参见:
  • 字段摘要

    字段
    修饰符和类型
    Field
    描述
    static final int
    中央目录 (CEN) 标头内部文件属性字段偏移量。
    static final int
    中央目录 (CEN) 标头外部文件属性字段偏移量。
    static final int
    中央目录 (CEN) 标头注释长度字段偏移量。
    static final int
    中央目录 (CEN) 标头未压缩文件 crc-32 值字段偏移量。
    static final int
    中央目录 (CEN) 头磁盘号起始字段偏移量。
    static final int
    中央目录 (CEN) 标头额外字段长度字段偏移量。
    static final int
    中央目录 (CEN) 标头加密、解密标志字段偏移量。
    static final int
    中央目录 (CEN) 标头大小(以字节为单位)(包括签名)。
    static final int
    中央目录 (CEN) 标头压缩方法字段偏移量。
    static final int
    中央目录 (CEN) 标头未压缩大小字段偏移量。
    static final int
    中央目录 (CEN) 头文件名长度字段偏移量。
    static final int
    中央目录 (CEN) 标头 LOC 标头偏移字段偏移量。
    static final long
    中央目录 (CEN) 标头签名。
    static final int
    中央目录 (CEN) 标头压缩大小字段偏移量。
    static final int
    中央目录 (CEN) 报头修改时间字段偏移量。
    static final int
    由字段偏移制作的中央目录 (CEN) 标头版本。
    static final int
    提取字段偏移量所需的中央目录 (CEN) 标头版本。
    static final int
    中央目录结束 (END) 头 zip 文件注释长度字段偏移量。
    static final int
    中央目录 (END) 标头大小的结尾(以字节为单位)(包括签名)。
    static final int
    第一个 CEN 标头字段偏移量的中央目录结束 (END) 标头偏移量。
    static final long
    中央目录结束 (END) 标头签名。
    static final int
    中央目录结束 (END) 标头中央目录大小(字节字段偏移量)。
    static final int
    中央目录结束 (END) 标头中此磁盘字段偏移量的条目数。
    static final int
    中央目录结束 (END) 标头条目总数字段偏移量。
    static final int
    额外的本地 (EXT) 标头未压缩文件 crc-32 值字段偏移量。
    static final int
    以字节为单位的额外本地 (EXT) 标头大小(包括签名)。
    static final int
    额外的本地 (EXT) 标头未压缩大小字段偏移量。
    static final long
    额外的本地 (EXT) 标头签名。
    static final int
    额外本地 (EXT) 标头压缩大小字段偏移量。
    static final int
    本地文件 (LOC) 标头未压缩文件 crc-32 值字段偏移量。
    static final int
    本地文件 (LOC) 标头额外字段长度字段偏移量。
    static final int
    本地文件 (LOC) 标头通用位标志字段偏移量。
    static final int
    以字节为单位的本地文件 (LOC) 标头大小(包括签名)。
    static final int
    本地文件 (LOC) 标头压缩方法字段偏移量。
    static final int
    本地文件 (LOC) 标头未压缩大小字段偏移量。
    static final int
    本地文件 (LOC) 头文件名长度字段偏移量。
    static final long
    本地文件 (LOC) 标头签名。
    static final int
    本地文件 (LOC) 标头压缩大小字段偏移量。
    static final int
    本地文件 (LOC) 头修改时间字段偏移量。
    static final int
    提取字段偏移量所需的本地文件 (LOC) 标头版本。
    static final String
    JAR 清单文件名。

    在类 java.util.zip.ZipFile 中声明的字段

    OPEN_DELETE, OPEN_READ
  • 构造方法总结

    构造方法
    构造方法
    描述
    JarFile(File file)
    创建一个新的 JarFile 以从指定的 File 对象读取。
    JarFile(File file, boolean verify)
    创建一个新的 JarFile 以从指定的 File 对象读取。
    JarFile(File file, boolean verify, int mode)
    创建一个新的 JarFile 以指定模式从指定的 File 对象读取。
    JarFile(File file, boolean verify, int mode, Runtime.Version version)
    创建一个新的 JarFile 以指定模式从指定的 File 对象读取。
    JarFile(String name)
    创建一个新的 JarFile 以从指定文件 name 中读取。
    JarFile(String name, boolean verify)
    创建一个新的 JarFile 以从指定文件 name 中读取。
  • 方法总结

    修饰符和类型
    方法
    描述
    返回表示多版本 jar 文件的未版本化配置的版本。
    返回 jar 文件条目的枚举。
    返回给定基本条目名称的 ZipEntry,如果未找到则返回 null
    返回用于读取指定 zip 文件条目内容的输入流。
    返回给定基本条目名称的 JarEntry,如果未找到则返回 null
    返回 jar 文件清单,如果没有则返回 null
    返回搜索版本化条目时使用的最大版本。
    final boolean
    指示此 jar 文件是否为多版本 jar 文件。
    返回表示多版本 jar 文件的有效运行时版本化配置的版本。
    在 jar 文件条目上返回有序的 Stream
    返回版本控制的 jar 文件条目的 Stream

    在类 java.util.zip.ZipFile 中声明的方法

    close, getComment, getName, size

    在类 java.lang.Object 中声明的方法

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • 字段详细信息

    • MANIFEST_NAME

      public static final String  MANIFEST_NAME
      JAR 清单文件名。
      参见:
    • LOCSIG

      static final long LOCSIG
      本地文件 (LOC) 标头签名。
      参见:
    • EXTSIG

      static final long EXTSIG
      额外的本地 (EXT) 标头签名。
      参见:
    • CENSIG

      static final long CENSIG
      中央目录 (CEN) 标头签名。
      参见:
    • ENDSIG

      static final long ENDSIG
      中央目录结束 (END) 标头签名。
      参见:
    • LOCHDR

      static final int LOCHDR
      以字节为单位的本地文件 (LOC) 标头大小(包括签名)。
      参见:
    • EXTHDR

      static final int EXTHDR
      以字节为单位的额外本地 (EXT) 标头大小(包括签名)。
      参见:
    • CENHDR

      static final int CENHDR
      中央目录 (CEN) 标头大小(以字节为单位)(包括签名)。
      参见:
    • ENDHDR

      static final int ENDHDR
      中央目录 (END) 标头大小的结尾(以字节为单位)(包括签名)。
      参见:
    • LOCVER

      static final int LOCVER
      提取字段偏移量所需的本地文件 (LOC) 标头版本。
      参见:
    • LOCFLG

      static final int LOCFLG
      本地文件 (LOC) 标头通用位标志字段偏移量。
      参见:
    • LOCHOW

      static final int LOCHOW
      本地文件 (LOC) 标头压缩方法字段偏移量。
      参见:
    • LOCTIM

      static final int LOCTIM
      本地文件 (LOC) 头修改时间字段偏移量。
      参见:
    • LOCCRC

      static final int LOCCRC
      本地文件 (LOC) 标头未压缩文件 crc-32 值字段偏移量。
      参见:
    • LOCSIZ

      static final int LOCSIZ
      本地文件 (LOC) 标头压缩大小字段偏移量。
      参见:
    • LOCLEN

      static final int LOCLEN
      本地文件 (LOC) 标头未压缩大小字段偏移量。
      参见:
    • LOCNAM

      static final int LOCNAM
      本地文件 (LOC) 头文件名长度字段偏移量。
      参见:
    • LOCEXT

      static final int LOCEXT
      本地文件 (LOC) 标头额外字段长度字段偏移量。
      参见:
    • EXTCRC

      static final int EXTCRC
      额外的本地 (EXT) 标头未压缩文件 crc-32 值字段偏移量。
      参见:
    • EXTSIZ

      static final int EXTSIZ
      额外本地 (EXT) 标头压缩大小字段偏移量。
      参见:
    • EXTLEN

      static final int EXTLEN
      额外的本地 (EXT) 标头未压缩大小字段偏移量。
      参见:
    • CENVEM

      static final int CENVEM
      由字段偏移制作的中央目录 (CEN) 标头版本。
      参见:
    • CENVER

      static final int CENVER
      提取字段偏移量所需的中央目录 (CEN) 标头版本。
      参见:
    • CENFLG

      static final int CENFLG
      中央目录 (CEN) 标头加密、解密标志字段偏移量。
      参见:
    • CENHOW

      static final int CENHOW
      中央目录 (CEN) 标头压缩方法字段偏移量。
      参见:
    • CENTIM

      static final int CENTIM
      中央目录 (CEN) 报头修改时间字段偏移量。
      参见:
    • CENCRC

      static final int CENCRC
      中央目录 (CEN) 标头未压缩文件 crc-32 值字段偏移量。
      参见:
    • CENSIZ

      static final int CENSIZ
      中央目录 (CEN) 标头压缩大小字段偏移量。
      参见:
    • CENLEN

      static final int CENLEN
      中央目录 (CEN) 标头未压缩大小字段偏移量。
      参见:
    • CENNAM

      static final int CENNAM
      中央目录 (CEN) 头文件名长度字段偏移量。
      参见:
    • CENEXT

      static final int CENEXT
      中央目录 (CEN) 标头额外字段长度字段偏移量。
      参见:
    • CENCOM

      static final int CENCOM
      中央目录 (CEN) 标头注释长度字段偏移量。
      参见:
    • CENDSK

      static final int CENDSK
      中央目录 (CEN) 头磁盘号起始字段偏移量。
      参见:
    • CENATT

      static final int CENATT
      中央目录 (CEN) 标头内部文件属性字段偏移量。
      参见:
    • CENATX

      static final int CENATX
      中央目录 (CEN) 标头外部文件属性字段偏移量。
      参见:
    • CENOFF

      static final int CENOFF
      中央目录 (CEN) 标头 LOC 标头偏移字段偏移量。
      参见:
    • ENDSUB

      static final int ENDSUB
      中央目录结束 (END) 标头中此磁盘字段偏移量的条目数。
      参见:
    • ENDTOT

      static final int ENDTOT
      中央目录结束 (END) 标头条目总数字段偏移量。
      参见:
    • ENDSIZ

      static final int ENDSIZ
      中央目录结束 (END) 标头中央目录大小(字节字段偏移量)。
      参见:
    • ENDOFF

      static final int ENDOFF
      第一个 CEN 标头字段偏移量的中央目录结束 (END) 标头偏移量。
      参见:
    • ENDCOM

      static final int ENDCOM
      中央目录结束 (END) 头 zip 文件注释长度字段偏移量。
      参见:
  • 构造方法详细信息

    • JarFile

      public JarFile(String  name) throws IOException
      创建一个新的 JarFile 以从指定文件 name 中读取。如果 JarFile 已签名,则将对其进行验证。
      参数:
      name - 要打开以供读取的 jar 文件的名称
      抛出:
      IOException - 如果发生 I/O 错误
      SecurityException - 如果 SecurityManager 拒绝访问该文件
    • JarFile

      public JarFile(String  name, boolean verify) throws IOException
      创建一个新的 JarFile 以从指定文件 name 中读取。
      参数:
      name - 要打开以供读取的 jar 文件的名称
      verify - 如果已签名,是否验证 jar 文件。
      抛出:
      IOException - 如果发生 I/O 错误
      SecurityException - 如果 SecurityManager 拒绝访问该文件
    • JarFile

      public JarFile(File  file) throws IOException
      创建一个新的 JarFile 以从指定的 File 对象读取。如果 JarFile 已签名,则将对其进行验证。
      参数:
      file - 要打开以供读取的 jar 文件
      抛出:
      IOException - 如果发生 I/O 错误
      SecurityException - 如果 SecurityManager 拒绝访问该文件
    • JarFile

      public JarFile(File  file, boolean verify) throws IOException
      创建一个新的 JarFile 以从指定的 File 对象读取。
      参数:
      file - 要打开以供读取的 jar 文件
      verify - 如果已签名,是否验证 jar 文件。
      抛出:
      IOException - 如果发生 I/O 错误
      SecurityException - 如果 SecurityManager 拒绝访问该文件。
    • JarFile

      public JarFile(File  file, boolean verify, int mode) throws IOException
      创建一个新的 JarFile 以指定模式从指定的 File 对象读取。模式参数必须是 OPEN_READOPEN_READ | OPEN_DELETE
      参数:
      file - 要打开以供读取的 jar 文件
      verify - 如果已签名,是否验证 jar 文件。
      mode - 打开文件的模式
      抛出:
      IOException - 如果发生 I/O 错误
      IllegalArgumentException - 如果 mode 参数无效
      SecurityException - 如果 SecurityManager 拒绝访问该文件
      自从:
      1.3
    • JarFile

      public JarFile(File  file, boolean verify, int mode, Runtime.Version  version) throws IOException
      创建一个新的 JarFile 以指定模式从指定的 File 对象读取。模式参数必须是 OPEN_READOPEN_READ | OPEN_DELETE 。版本参数在转换为规范形式后,用于配置 JarFile 以处理多版本 jar 文件。

      从版本参数派生的规范形式是 Runtime.Version.parse(Integer.toString(n)),其中 nMath.max(version.feature(), JarFile.baseVersion().feature())

      参数:
      file - 要打开以供读取的 jar 文件
      verify - 如果已签名,是否验证 jar 文件。
      mode - 打开文件的模式
      version - 指定多版本 jar 文件的发布版本
      抛出:
      IOException - 如果发生 I/O 错误
      IllegalArgumentException - 如果 mode 参数无效
      SecurityException - 如果 SecurityManager 拒绝访问该文件
      NullPointerException - 如果 versionnull
      自从:
      9
  • 方法详情

    • baseVersion

      public static Runtime.Version  baseVersion()
      返回表示多版本 jar 文件的未版本化配置的版本。
      返回:
      表示未版本化配置的版本
      自从:
      9
    • runtimeVersion

      public static Runtime.Version  runtimeVersion()
      返回表示多版本 jar 文件的有效运行时版本化配置的版本。

      默认情况下,返回的 Version 的功能版本号将等于 Runtime.version() 的功能版本号。但是,如果设置了 jdk.util.jar.version 属性,则返回的 Version 是从该属性派生的,并且功能版本号可能不相等。

      返回:
      表示运行时版本化配置的版本
      自从:
      9
    • getVersion

      public final Runtime.Version  getVersion()
      返回搜索版本化条目时使用的最大版本。

      如果此 JarFile 不是多版本 jar 文件或未配置为如此处理,则返回的版本将与从 baseVersion() 返回的版本相同。

      返回:
      最大版本
      自从:
      9
    • isMultiRelease

      public final boolean isMultiRelease()
      指示此 jar 文件是否为多版本 jar 文件。
      返回:
      如果此 JarFile 是多版本 jar 文件,则为 true
      自从:
      9
    • getManifest

      public Manifest  getManifest() throws IOException
      返回 jar 文件清单,如果没有则返回 null
      返回:
      jar 文件清单,如果没有则为 null
      抛出:
      IllegalStateException - 如果 jar 文件已关闭,可能会抛出
      IOException - 如果发生 I/O 错误
    • getJarEntry

      public JarEntry  getJarEntry(String  name)
      返回给定基本条目名称的 JarEntry,如果未找到则返回 null

      如果此 JarFile 是一个多版本 jar 文件并且被配置为这样处理,则执行搜索以查找并返回 JarEntry 这是与给定条目名称关联的最新版本条目。返回的 JarEntry 是对应于前缀为字符串 "META-INF/versions/{n}/" 的给定基本条目名称的版本化条目,对于存在条目的 n 的最大值。如果不存在这样的版本化条目,则返回基本条目的 JarEntry,否则如果未找到条目,则返回 nulln 版本的初始值是方法 getVersion() 返回的最大版本。

      实现要求:
      此实现调用 getEntry(String)
      参数:
      name - jar 文件条目名称
      返回:
      给定条目名称的 JarEntry 或版本化条目名称,如果未找到,则为 null
      抛出:
      IllegalStateException - 如果 jar 文件已关闭,可能会抛出
      参见:
    • getEntry

      public ZipEntry  getEntry(String  name)
      返回给定基本条目名称的 ZipEntry,如果未找到则返回 null

      如果此 JarFile 是一个多版本 jar 文件并且被配置为这样处理,则执行搜索以查找并返回 ZipEntry 这是与给定条目名称关联的最新版本条目。返回的 ZipEntry 是对应于前缀为字符串 "META-INF/versions/{n}/" 的给定基本条目名称的版本化条目,对于存在条目的 n 的最大值。如果不存在这样的版本化条目,则返回基本条目的 ZipEntry,否则如果未找到条目,则返回 nulln 版本的初始值是方法 getVersion() 返回的最大版本。

      重写:
      getEntry 在类 ZipFile
      实现要求:
      即使没有相应的基本条目,此实现也可能会为请求的名称返回版本化条目。如果存在匹配的私有或包私有版本化条目,就会发生这种情况。如果子类覆盖此方法,请确保覆盖方法调用 super.getEntry(name) 以获取所有版本化条目。
      参数:
      name - jar 文件条目名称
      返回:
      给定条目名称或版本化条目名称的 ZipEntrynull(如果未找到)
      抛出:
      IllegalStateException - 如果 jar 文件已关闭,可能会抛出
      参见:
    • entries

      public Enumeration <JarEntry > entries()
      返回 jar 文件条目的枚举。
      重写:
      entries 在类 ZipFile
      返回:
      jar 文件条目的枚举
      抛出:
      IllegalStateException - 如果 jar 文件已关闭,可能会抛出
    • stream

      public Stream <JarEntry > stream()
      在 jar 文件条目上返回有序的 Stream。条目出现在 Stream 中的顺序与它们出现在 jar 文件的中央目录中的顺序相同。
      重写:
      stream 在类 ZipFile
      返回:
      此 jar 文件中有序的 Stream 条目
      抛出:
      IllegalStateException - 如果 jar 文件已关闭
      自从:
      1.8
    • versionedStream

      public Stream <JarEntry > versionedStream()
      返回版本控制的 jar 文件条目的 Stream

      如果这个 JarFile 是一个多版本 jar 文件并且被配置为这样处理,那么流中的条目是与相应的基本条目名称关联的最新版本化条目。最新版本条目的最大版本是 getVersion() 返回的版本。返回的流可能包含仅作为版本化条目存在的条目。如果 jar 文件不是多版本 jar 文件或 JarFile 未配置为处理多版本 jar 文件,则此方法返回与 stream() 返回的流相同的流。

      返回:
      版本化条目流
      自从:
      10
    • getInputStream

      public InputStream  getInputStream(ZipEntry  ze) throws IOException
      返回用于读取指定 zip 文件条目内容的输入流。
      重写:
      getInputStream 在类 ZipFile
      API 注意:
      此方法返回的 InputStream 可以包装一个 InflaterInputStream ,其 read(byte[], int, int) 方法可以修改输出缓冲区的任何元素。
      参数:
      ze - zip 文件条目
      返回:
      用于读取指定 zip 文件条目内容的输入流;如果 jar 文件中不存在 zip 文件条目,则为 null
      抛出:
      ZipException - 如果发生 zip 文件格式错误
      IOException - 如果发生 I/O 错误
      SecurityException - 如果任何 jar 文件条目未正确签名。
      IllegalStateException - 如果 jar 文件已关闭,可能会抛出