Module java.base
Package java.util.jar

Class JarInputStream

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

public class JarInputStream extends ZipInputStream
JarInputStream类扩展了ZipInputStream,用于从输入流中读取JAR文件的内容。它支持读取可选的Manifest条目。 Manifest可用于存储关于JAR文件及其条目的元信息。

访问Manifest

getManifest方法用于从条目META-INF/MANIFEST.MF中返回Manifest,当它是流中的第一个条目时(或者如果流中的第一个条目是META-INF/,第二个条目是META-INF/MANIFEST.MF)。

getNextJarEntry()getNextEntry()方法用于从流中读取JAR文件条目。当Manifest(META-INF/MANIFEST.MF)位于流的开头时,这些方法会跳过Manifest。换句话说,当Manifest是流中的第一个条目时,这些方法不会返回Manifest的条目。如果第一个条目是META-INF/,第二个条目是Manifest,则这些方法也会跳过它们。这些方法是否在Manifest后面出现时跳过Manifest未指定。

已签名的JAR文件

JarInputStream在以下情况下验证已签名的JAR文件条目的签名:
  • Manifest是流中的第一个条目(或者如果流中的第一个条目是META-INF/,第二个条目是META-INF/MANIFEST.MF)。
  • 所有与签名相关的条目紧随Manifest之后

一旦JarEntry完全验证完成,即通过读取直到条目的输入流结束,就可以调用JarEntry.getCertificates()来获取此条目的证书,调用JarEntry.getCodeSigners()来获取签名者。

重要的是验证过程不包括验证签名者的证书。调用者应检查JarEntry.getCodeSigners()的返回值以进一步确定是否可以信任签名。

API注释:
如果在JAR文件签名后修改了JarEntry,则在读取条目时将抛出SecurityException
自版本:
1.2
参见:
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    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
    中央目录(END)头部第一个CEN头部偏移量字段偏移量。
    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)头部需要提取的版本字段偏移量。

    Fields declared in class java.util.zip.InflaterInputStream

    buf, inf, len

    Fields declared in class java.io.FilterInputStream

    in
  • Constructor Summary

    Constructors
    Constructor
    Description
    创建一个新的JarInputStream并读取可选的manifest。
    JarInputStream(InputStream in, boolean verify)
    创建一个新的JarInputStream并读取可选的manifest。
  • Method Summary

    Modifier and Type
    Method
    Description
    protected ZipEntry
    为指定的JAR文件条目名称创建一个新的JarEntryZipEntry)。
    当JAR文件的第一个条目是流中的第一个条目时(或者如果流中的第一个条目是META-INF/,第二个条目是META-INF/MANIFEST.MF),返回此JAR文件的Manifest,否则返回null
    读取下一个ZIP文件条目并将流定位在条目数据的开头。
    读取下一个JAR文件条目并将流定位在条目数据的开头。
    int
    read(byte[] b, int off, int len)
    从当前JAR条目读取到字节数组中,返回膨胀的字节数。

    Methods declared in class java.util.zip.InflaterInputStream

    fill, mark, markSupported, reset

    Methods declared in class java.io.FilterInputStream

    read

    Methods declared in class java.io.InputStream

    nullInputStream

    Methods declared in class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • 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
      中央目录结束(END)头部第一个CEN头部偏移量字段偏移量。
      参见:
    • ENDCOM

      static final int ENDCOM
      中央目录结束(END)头部zip文件注释长度字段偏移量。
      参见:
  • Constructor Details

    • JarInputStream

      public JarInputStream(InputStream in) throws IOException
      创建一个新的JarInputStream并读取可选清单。如果存在清单,并且JarInputStream已签名,则还会尝试验证签名。
      参数:
      in - 实际输入流
      抛出:
      IOException - 如果发生I/O错误
    • JarInputStream

      public JarInputStream(InputStream in, boolean verify) throws IOException
      创建一个新的JarInputStream并读取可选清单。如果存在清单,并且verify为true,则还会尝试验证签名。
      参数:
      in - 实际输入流
      verify - 是否验证已签名的JarInputStream
      抛出:
      IOException - 如果发生I/O错误
  • Method Details

    • getManifest

      public Manifest getManifest()
      返回此JAR文件的Manifest,当它是流中的第一个条目时(或者如果流中的第一个条目是META-INF/,第二个条目是META-INF/MANIFEST.MF),否则返回null
      返回:
      此JAR文件的Manifest,否则返回null
    • getNextEntry

      public ZipEntry getNextEntry() throws IOException
      读取下一个ZIP文件条目,并将流定位到条目数据的开头。如果启用了验证,并且在定位下一个条目的过程中检测到任何无效签名,将导致异常。
      覆盖:
      getNextEntry 在类 ZipInputStream
      返回:
      下一个ZIP文件条目,如果没有更多条目则返回null
      抛出:
      ZipException - 如果发生ZIP文件错误
      IOException - 如果发生I/O错误
      SecurityException - 如果任何jar文件条目签名不正确。
    • getNextJarEntry

      public JarEntry getNextJarEntry() throws IOException
      读取下一个JAR文件条目,并将流定位到条目数据的开头。如果启用了验证,并且在定位下一个条目的过程中检测到任何无效签名,将导致异常。
      返回值:
      下一个JAR文件条目,如果没有更多条目则返回null
      抛出:
      ZipException - 如果发生ZIP文件错误
      IOException - 如果发生I/O错误
      SecurityException - 如果任何JAR文件条目签名不正确
    • read

      public int read(byte[] b, int off, int len) throws IOException
      从当前JAR条目读取到一个字节数组中,返回膨胀字节数的数量。如果len不为零,则该方法会阻塞,直到有一些输入可用;否则,不会读取任何字节,并返回0

      如果当前条目被压缩,并且此方法返回一个非零整数n,则buf[off]buf[off+n-1]包含未压缩的数据。元素buf[off+n]buf[off+len-1]的内容是未定义的,与InputStream超类的规范相反,因此在膨胀操作期间,实现可以自由修改这些元素。如果此方法返回-1或抛出异常,则buf[off]buf[off+len -1]的内容是未定义的。

      如果启用了验证,当前条目上的任何无效签名将在到达条目末尾之前的某个时候报告。

      覆盖:
      read 在类 ZipInputStream
      参数:
      b - 读取数据的缓冲区
      off - 目标数组b中的起始偏移量
      len - 要读取的最大字节数
      返回值:
      实际读取的字节数,如果到达条目末尾则返回-1
      抛出:
      NullPointerException - 如果bnull
      IndexOutOfBoundsException - 如果off为负数,len为负数,或len大于b.length - off
      ZipException - 如果发生ZIP文件错误
      IOException - 如果发生I/O错误
      SecurityException - 如果任何JAR文件条目签名不正确
      参见:
    • createZipEntry

      protected ZipEntry createZipEntry(String name)
      为指定的JAR文件条目名称创建一个新的JarEntryZipEntry)。指定的JAR文件条目名称的清单属性将被复制到新的JarEntry中。
      覆盖:
      createZipEntry 在类 ZipInputStream
      参数:
      name - JAR/ZIP文件条目的名称
      返回值:
      刚创建的JarEntry对象