Module java.base
Package java.util.zip

Class ZipInputStream

所有已实现的接口:
Closeable, AutoCloseable
直接已知的子类:
JarInputStream

public class ZipInputStream extends InflaterInputStream
用于从ZIP文件格式的字节流中读取压缩和未压缩的ZIP文件条目的输入流。

读取Zip文件条目

使用getNextEntry()方法来读取下一个ZIP文件条目(ZIP格式中的本地文件(LOC)头记录)并将流定位到条目的文件数据处。文件数据可以使用ZipInputStream的读取方法之一来读取,例如readreadAllBytes。例如:
  Path jar = Path.of("foo.jar");
  try (InputStream is = Files.newInputStream(jar);
       ZipInputStream zis = new ZipInputStream(is)) {
      ZipEntry ze;
      while((ze= zis.getNextEntry()) != null) {
         var bytes = zis.readAllBytes();
         System.out.printf("条目: %s, 读取的字节数: %s%n", ze.getName(),
                 bytes.length);
      }
  }
API注释:
LOC头包含有关Zip文件条目的元数据。 ZipInputStream不会读取条目的中央目录(CEN)头,因此将无法访问其元数据,例如外部文件属性。当需要访问存储在CEN头中的信息时,可以使用ZipFile
自版本:
1.1
  • 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
    额外本地(EXT)头未压缩文件crc-32值字段偏移量。
    static final int
    额外本地(EXT)头字节大小(包括签名)。
    static final int
    额外本地(EXT)头未压缩大小字段偏移量。
    static final int
    额外本地(EXT)头签名。
    static final long
    额外本地(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 int
    本地文件(LOC)头签名。
    static final long
    本地文件(LOC)头压缩大小字段偏移量。
    static final int
    本地文件(LOC)头修改时间字段偏移量。
    static final int
    本地文件(LOC)头需要提取的版本字段偏移量。
    static final int
    创建一个新的ZIP输入流。

    Fields declared in class java.util.zip.InflaterInputStream

    buf, inf, len

    Fields declared in class java.io.FilterInputStream

    in
  • Constructor Summary

    Constructors
    Constructor
    Description
    创建一个新的ZIP输入流。
    当检测到当前ZIP条目的流结束或在当前ZIP条目上调用了closeEntry()时返回0,否则返回1。
  • Method Summary

    Modifier and Type
    Method
    Description
    int
    关闭此输入流并释放与流关联的任何系统资源。
    void
    close()
    关闭当前ZIP条目并将流定位到读取下一个条目。
    void
    为指定的条目名称创建一个新的ZipEntry对象。
    protected ZipEntry
    读取下一个ZIP文件条目并将流定位到条目数据的开头。
    从输入流中读取当前ZIP条目的下一个数据字节。
    int
    read()
    从输入流中为当前ZIP条目的给定字节数组读取请求的字节数,返回膨胀的字节数。
    int
    read(byte[] b, int off, int len)
    从输入流中读取当前ZIP条目的所有剩余字节。
    byte[]
    从输入流中为当前ZIP条目的给定字节数组读取请求的字节数,返回膨胀的字节数。
    int
    readNBytes(byte[] b, int off, int len)
    从输入流中读取当前ZIP条目的指定字节数。
    byte[]
    readNBytes(int len)
    跳过并丢弃当前ZIP条目的n字节数据。
    long
    skip(long n)
    从输入流中跳过并丢弃当前ZIP条目的确切n字节数据。
    void
    skipNBytes(long n)
    从输入流中读取当前ZIP条目的所有字节,并按照读取顺序将字节写入给定的输出流。
    long
    本地文件(LOC)头签名。

    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
      Local file (LOC) header signature.
      参见:
    • 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

    • ZipInputStream

      public ZipInputStream(InputStream in)
      创建一个新的 ZIP 输入流。

      使用 UTF-8 charset 来解码条目名称。

      参数:
      in - 实际输入流
    • ZipInputStream

      public ZipInputStream(InputStream in, Charset charset)
      创建一个新的 ZIP 输入流。
      参数:
      in - 实际输入流
      charset - 用于解码 ZIP 条目名称的charset(如果 ZIP 条目的通用标志位的语言编码位已设置,则忽略)。
      自 JDK 1.7 起
  • Method Details

    • getNextEntry

      public ZipEntry getNextEntry() throws IOException
      读取下一个 ZIP 文件条目并将流定位到条目数据的开头。
      返回:
      下一个 ZIP 文件条目,如果没有更多条目则返回 null
      抛出:
      ZipException - 如果发生 ZIP 文件错误
      IOException - 如果发生 I/O 错误
    • closeEntry

      public void closeEntry() throws IOException
      关闭当前 ZIP 条目并定位流以读取下一个条目。
      抛出:
      ZipException - 如果发生 ZIP 文件错误
      IOException - 如果发生 I/O 错误
    • available

      public int available() throws IOException
      当检测到当前 ZIP 条目的流结束时返回 0,或者在当前 ZIP 条目上调用了closeEntry(),否则返回 1。

      程序不应该依赖此方法返回可以无阻塞读取的实际字节数。

      覆盖:
      available 在类 InflaterInputStream
      返回:
      当检测到当前 ZIP 条目的流结束时返回 0,或者在当前 ZIP 条目上调用了closeEntry(),否则返回 1。
      抛出:
      IOException - 如果发生 I/O 错误。
    • read

      public int read() throws IOException
      从当前 ZIP 条目的输入流中读取下一个数据字节。此方法将阻塞,直到有足够的输入可用于解压缩。
      覆盖:
      read 在类中 InflaterInputStream
      返回:
      读取的字节,如果到达流的末尾则返回-1
      抛出:
      IOException - 如果发生I/O错误
      参见:
    • readAllBytes

      public byte[] readAllBytes() throws IOException
      从当前ZIP条目的输入流中读取所有剩余的字节。此方法会阻塞,直到所有剩余的字节都被读取并检测到流的末尾,或者抛出异常。此方法不会关闭输入流。

      当此流到达流的末尾时,进一步调用此方法将返回一个空的字节数组。

      请注意,此方法适用于简单情况,方便将所有字节读入字节数组中。不适用于读取大量数据的输入流。

      如果从输入流中读取时发生I/O错误,则可能在读取了一些但不是全部字节后发生错误。因此,输入流可能尚未到达流的末尾,并且可能处于不一致的状态。强烈建议在发生I/O错误时立即关闭流。

      覆盖:
      readAllBytes 在类中 InputStream
      返回:
      包含从此输入流中读取的字节的字节数组
      抛出:
      OutOfMemoryError - 如果无法分配所需大小的数组。
      IOException - 如果发生I/O错误
      自:
      9
    • readNBytes

      public byte[] readNBytes(int len) throws IOException
      从当前ZIP条目的输入流中读取指定数量的字节。此方法会阻塞,直到已读取请求的字节数、检测到流的末尾或抛出异常。此方法不会关闭输入流。

      返回的数组的长度等于从流中读取的字节数。如果len为零,则不会读取任何字节,并返回一个空的字节数组。否则,将从流中读取最多len字节。如果遇到流的末尾,则可能读取的字节数少于len

      当此流到达流的末尾时,进一步调用此方法将返回一个空的字节数组。

      请注意,此方法适用于简单情况,方便将指定数量的字节读入字节数组中。此方法分配的内存总量与从流中读取的字节数成正比,受len限制。因此,如果有足够的内存可用,可以安全地使用非常大的len值调用该方法。

      如果从输入流中读取时发生I/O错误,则可能在读取了一些但不是全部字节后发生错误。因此,输入流可能尚未到达流的末尾,并且可能处于不一致的状态。强烈建议在发生I/O错误时立即关闭流。

      覆盖:
      readNBytes 在类中 InputStream
      实现注意:
      此方法调用super.readNBytes(int len)
      参数:
      len - 要读取的最大字节数
      返回:
      包含从此输入流中读取的字节的字节数组
      抛出:
      OutOfMemoryError - 如果无法分配所需大小的数组。
      IOException - 如果发生I/O错误
      自:
      11
    • readNBytes

      public int readNBytes(byte[] b, int off, int len) throws IOException
      从输入流中为当前ZIP条目读取请求的字节数,并将这些字节写入给定的字节数组,返回膨胀字节数。此方法会阻塞,直到已读取len字节的输入数据、检测到流的末尾或抛出异常。实际读取的字节数(可能为零)将被返回。此方法不会关闭输入流。

      如果在读取了len字节之前到达流的末尾,则将返回实际读取的字节数。当此流到达流的末尾时,进一步调用此方法将返回零。

      如果len为零,则不会读取任何字节,并返回0;否则,将尝试读取最多len字节。

      第一个读取的字节存储在元素b[off]中,下一个字节存储在b[off+1]中,依此类推。读取的字节数最多等于len。设k为实际读取的字节数;这些字节将存储在元素b[off]b[off+k-1]中,使元素b[off+k ]b[off+len-1]不受影响。

      如果从输入流中读取时发生I/O错误,则可能在更新了一些但不是全部b字节后发生错误。因此,输入流和b可能处于不一致的状态。强烈建议在发生I/O错误时立即关闭流。

      覆盖:
      readNBytes 在类中 InputStream
      参数:
      b - 要读取数据的字节数组
      off - 写入数据的字节数组b中的起始偏移量
      len - 要读取的最大字节数
      返回:
      实际读取到缓冲区中的字节数
      抛出:
      NullPointerException - 如果bnull
      IndexOutOfBoundsException - 如果off为负数,len为负数,或len大于b.length - off
      IOException - 如果发生I/O错误
      自:
      9
    • skipNBytes

      public void skipNBytes(long n) throws IOException
      跳过并丢弃当前ZIP条目的输入流中的确切n字节数据。如果n为零,则不会跳过任何字节。如果n为负数,则不会跳过任何字节。子类可能会以不同方式处理负值。

      此方法会阻塞,直到已跳过请求的字节数、到达文件末尾或抛出异常。

      如果在流到达所需位置之前到达流的末尾,则会抛出EOFException

      如果发生I/O错误,则输入流可能处于不一致的状态。强烈建议在发生I/O错误时立即关闭流。

      覆盖:
      skipNBytes 在类中 InputStream
      参数:
      n - 要跳过的字节数。
      抛出:
      IOException - 如果无法正确定位流或发生I/O错误。
      自:
      12
      参见:
    • transferTo

      public long transferTo(OutputStream out) throws IOException
      从当前ZIP条目的输入流中读取所有字节,并按照读取顺序将字节写入给定的输出流。返回时,此输入流将处于流的末尾。此方法不会关闭任何流。

      此方法可能会无限期地阻塞读取输入流或写入输出流。对于输入和/或输出流“异步关闭”或在传输过程中线程中断的情况,行为高度依赖于输入和输出流的特定情况,因此未指定。

      如果传输的总字节数大于Long.MAX_VALUE,则将返回Long.MAX_VALUE

      如果从输入流中读取或写入输出流时发生I/O错误,则可能在读取或写入一些字节后发生错误。因此,输入流可能尚未到达流的末尾,一个或两个流可能处于不一致的状态。强烈建议在发生I/O错误时立即关闭两个流。

      覆盖:
      transferTo 在类中 InputStream
      参数:
      out - 输出流,非空
      返回:
      传输的字节数
      抛出:
      NullPointerException - 如果outnull
      IOException - 如果在读取或写入时发生I/O错误
      自:
      9
    • read

      public int read(byte[] b, int off, int len) throws IOException
      从输入流中读取请求的字节数到给定的字节数组中的当前ZIP条目,返回膨胀字节数。如果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 在类中 InflaterInputStream
      参数:
      b - 要读取数据的缓冲区
      off - 目标数组b中的起始偏移量
      len - 要读取的最大字节数
      返回:
      实际读取的字节数,如果到达条目末尾则返回-1
      抛出:
      NullPointerException - 如果bnull
      IndexOutOfBoundsException - 如果off为负数,len为负数,或len大于b.length - off
      ZipException - 如果发生ZIP文件错误
      IOException - 如果发生I/O错误
      参见:
    • skip

      public long skip(long n) throws IOException
      跳过并丢弃当前ZIP条目的输入流中的n字节数据。
      覆盖:
      skip 在类中 InflaterInputStream
      参数:
      n - 要跳过的字节数
      返回:
      实际跳过的字节数
      抛出:
      ZipException - 如果发生ZIP文件错误
      IOException - 如果发生I/O错误
      IllegalArgumentException - 如果n < 0
      参见:
    • close

      public void close() throws IOException
      关闭此输入流并释放与流关联的任何系统资源。
      指定者:
      close 在接口中 AutoCloseable
      指定者:
      close 在接口中 Closeable
      覆盖:
      close 在类中 InflaterInputStream
      抛出:
      IOException - 如果发生I/O错误
      参见:
    • createZipEntry

      protected ZipEntry createZipEntry(String name)
      为指定的条目名称创建一个新的ZipEntry对象。
      参数:
      name - ZIP文件条目名称
      返回:
      刚创建的ZipEntry