模块 java.base

类 ZipInputStream

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

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

读取 Zip 文件条目

getNextEntry() 方法用于读取下一个 ZIP 文件条目(ZIP 格式的本地文件 (LOC) 标头记录)并将流定位到条目的文件数据。文件数据可以使用 ZipInputStream 读取方法之一读取,例如 read readAllBytes() 。例如:
 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("Entry: %s, bytes read: %s%n", ze.getName(),
         bytes.length);
   }
 }
 
API 注意:
LOC 标头包含有关 Zip 文件条目的元数据。 ZipInputStream 不会读取条目的中央目录 (CEN) 标头,因此无法访问其元数据,例如外部文件属性。当需要存储在 CEN 标头中的信息时,可以使用 ZipFile
自从:
1.1
  • 字段摘要

    字段
    修饰符和类型
    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) 标头版本。

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

    buf, inf, len

    在类 java.io.FilterInputStream 中声明的字段

    in
  • 构造方法总结

    构造方法
    构造方法
    描述
    创建一个新的 ZIP 输入流。
    创建一个新的 ZIP 输入流。
  • 方法总结

    修饰符和类型
    方法
    描述
    int
    当检测到当前 ZIP 条目的流结尾或 closeEntry() 已在当前 ZIP 条目上调用时返回 0,否则返回 1。
    void
    关闭此输入流并释放与该流关联的所有系统资源。
    void
    关闭当前 ZIP 条目并定位流以读取下一个条目。
    protected ZipEntry
    为指定条目名称创建一个新的 ZipEntry 对象。
    读取下一个 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 条目的输入流中读取指定数量的字节。
    long
    skip(long n)
    对于当前 ZIP 条目,跳过并丢弃此输入流中的 n 字节数据。
    void
    skipNBytes(long n)
    跳过并丢弃来自当前 ZIP 条目的输入流中的 n 字节数据。
    long
    从此输入流中读取当前 ZIP 条目的所有字节,并按照读取顺序将字节写入给定的输出流。

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

    fill, mark, markSupported, reset

    在类 java.io.FilterInputStream 中声明的方法

    read

    在类 java.io.InputStream 中声明的方法

    nullInputStream

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

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

    • 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 文件注释长度字段偏移量。
      参见:
  • 构造方法详细信息

    • ZipInputStream

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

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

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

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

    • 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 条目的流结尾或 closeEntry() 已在当前 ZIP 条目上调用时返回 0,否则返回 1。

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

      重写:
      available 在类 InflaterInputStream
      返回:
      当检测到当前 ZIP 条目的流结尾或 closeEntry() 已在当前 ZIP 条目上调用时为 0,否则为 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 条目的所有字节,并按照读取顺序将字节写入给定的输出流。返回时,此输入流将位于流的末尾。此方法不会关闭任何一个流。

      此方法可能会无限期地阻止从输入流读取或写入输出流。输入和/或输出流为异步关闭,或传输期间中断的线程,是高度输入和输出流特定的,因此未指定。

      如果从输入流读取或写入输出流发生 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