- 所有已实现的接口:
-
Closeable
,AutoCloseable
- 直接已知的子类:
-
JarInputStream
读取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("条目: %s, 读取的字节数: %s%n", ze.getName(),
bytes.length);
}
}
- API注释:
-
LOC头包含有关Zip文件条目的元数据。
ZipInputStream
不会读取条目的中央目录(CEN)头,因此将无法访问其元数据,例如外部文件属性。当需要访问存储在CEN头中的信息时,可以使用ZipFile。 - 自版本:
- 1.1
-
Field Summary
Modifier and TypeFieldDescriptionstatic 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
ConstructorDescription创建一个新的ZIP输入流。ZipInputStream
(InputStream in, Charset charset) 当检测到当前ZIP条目的流结束或在当前ZIP条目上调用了closeEntry()
时返回0,否则返回1。 -
Method Summary
Modifier and TypeMethodDescriptionint
关闭此输入流并释放与流关联的任何系统资源。void
close()
关闭当前ZIP条目并将流定位到读取下一个条目。void
为指定的条目名称创建一个新的ZipEntry
对象。protected ZipEntry
createZipEntry
(String name) 读取下一个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
transferTo
(OutputStream out) 本地文件(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
-
Field Details
-
LOCSIG
static final long LOCSIGLocal 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
-
Method Details
-
getNextEntry
读取下一个 ZIP 文件条目并将流定位到条目数据的开头。- 返回:
- 下一个 ZIP 文件条目,如果没有更多条目则返回 null
- 抛出:
-
ZipException
- 如果发生 ZIP 文件错误 -
IOException
- 如果发生 I/O 错误
-
closeEntry
关闭当前 ZIP 条目并定位流以读取下一个条目。- 抛出:
-
ZipException
- 如果发生 ZIP 文件错误 -
IOException
- 如果发生 I/O 错误
-
available
当检测到当前 ZIP 条目的流结束时返回 0,或者在当前 ZIP 条目上调用了closeEntry()
,否则返回 1。程序不应该依赖此方法返回可以无阻塞读取的实际字节数。
- 覆盖:
-
available
在类InflaterInputStream
中 - 返回:
-
当检测到当前 ZIP 条目的流结束时返回 0,或者在当前 ZIP 条目上调用了
closeEntry()
,否则返回 1。 - 抛出:
-
IOException
- 如果发生 I/O 错误。
-
read
从当前 ZIP 条目的输入流中读取下一个数据字节。此方法将阻塞,直到有足够的输入可用于解压缩。- 覆盖:
-
read
在类中InflaterInputStream
- 返回:
- 读取的字节,如果到达流的末尾则返回-1
- 抛出:
-
IOException
- 如果发生I/O错误 - 参见:
-
readAllBytes
从当前ZIP条目的输入流中读取所有剩余的字节。此方法会阻塞,直到所有剩余的字节都被读取并检测到流的末尾,或者抛出异常。此方法不会关闭输入流。当此流到达流的末尾时,进一步调用此方法将返回一个空的字节数组。
请注意,此方法适用于简单情况,方便将所有字节读入字节数组中。不适用于读取大量数据的输入流。
如果从输入流中读取时发生I/O错误,则可能在读取了一些但不是全部字节后发生错误。因此,输入流可能尚未到达流的末尾,并且可能处于不一致的状态。强烈建议在发生I/O错误时立即关闭流。
- 覆盖:
-
readAllBytes
在类中InputStream
- 返回:
- 包含从此输入流中读取的字节的字节数组
- 抛出:
-
OutOfMemoryError
- 如果无法分配所需大小的数组。 -
IOException
- 如果发生I/O错误 - 自:
- 9
-
readNBytes
从当前ZIP条目的输入流中读取指定数量的字节。此方法会阻塞,直到已读取请求的字节数、检测到流的末尾或抛出异常。此方法不会关闭输入流。返回的数组的长度等于从流中读取的字节数。如果
len
为零,则不会读取任何字节,并返回一个空的字节数组。否则,将从流中读取最多len
字节。如果遇到流的末尾,则可能读取的字节数少于len
。当此流到达流的末尾时,进一步调用此方法将返回一个空的字节数组。
请注意,此方法适用于简单情况,方便将指定数量的字节读入字节数组中。此方法分配的内存总量与从流中读取的字节数成正比,受
len
限制。因此,如果有足够的内存可用,可以安全地使用非常大的len
值调用该方法。如果从输入流中读取时发生I/O错误,则可能在读取了一些但不是全部字节后发生错误。因此,输入流可能尚未到达流的末尾,并且可能处于不一致的状态。强烈建议在发生I/O错误时立即关闭流。
- 覆盖:
-
readNBytes
在类中InputStream
- 实现注意:
-
此方法调用
super.readNBytes(int len)
。 - 参数:
-
len
- 要读取的最大字节数 - 返回:
- 包含从此输入流中读取的字节的字节数组
- 抛出:
-
OutOfMemoryError
- 如果无法分配所需大小的数组。 -
IOException
- 如果发生I/O错误 - 自:
- 11
-
readNBytes
从输入流中为当前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
- 如果b
为null
-
IndexOutOfBoundsException
- 如果off
为负数,len
为负数,或len
大于b.length - off
-
IOException
- 如果发生I/O错误 - 自:
- 9
-
skipNBytes
跳过并丢弃当前ZIP条目的输入流中的确切n
字节数据。如果n
为零,则不会跳过任何字节。如果n
为负数,则不会跳过任何字节。子类可能会以不同方式处理负值。此方法会阻塞,直到已跳过请求的字节数、到达文件末尾或抛出异常。
如果在流到达所需位置之前到达流的末尾,则会抛出
EOFException
。如果发生I/O错误,则输入流可能处于不一致的状态。强烈建议在发生I/O错误时立即关闭流。
- 覆盖:
-
skipNBytes
在类中InputStream
- 参数:
-
n
- 要跳过的字节数。 - 抛出:
-
IOException
- 如果无法正确定位流或发生I/O错误。 - 自:
- 12
- 参见:
-
transferTo
从当前ZIP条目的输入流中读取所有字节,并按照读取顺序将字节写入给定的输出流。返回时,此输入流将处于流的末尾。此方法不会关闭任何流。此方法可能会无限期地阻塞读取输入流或写入输出流。对于输入和/或输出流“异步关闭”或在传输过程中线程中断的情况,行为高度依赖于输入和输出流的特定情况,因此未指定。
如果传输的总字节数大于Long.MAX_VALUE,则将返回
Long.MAX_VALUE
。如果从输入流中读取或写入输出流时发生I/O错误,则可能在读取或写入一些字节后发生错误。因此,输入流可能尚未到达流的末尾,一个或两个流可能处于不一致的状态。强烈建议在发生I/O错误时立即关闭两个流。
- 覆盖:
-
transferTo
在类中InputStream
- 参数:
-
out
- 输出流,非空 - 返回:
- 传输的字节数
- 抛出:
-
NullPointerException
- 如果out
为null
-
IOException
- 如果在读取或写入时发生I/O错误 - 自:
- 9
-
read
从输入流中读取请求的字节数到给定的字节数组中的当前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
- 如果b
为null
。 -
IndexOutOfBoundsException
- 如果off
为负数,len
为负数,或len
大于b.length - off
-
ZipException
- 如果发生ZIP文件错误 -
IOException
- 如果发生I/O错误 - 参见:
-
skip
跳过并丢弃当前ZIP条目的输入流中的n
字节数据。- 覆盖:
-
skip
在类中InflaterInputStream
- 参数:
-
n
- 要跳过的字节数 - 返回:
- 实际跳过的字节数
- 抛出:
-
ZipException
- 如果发生ZIP文件错误 -
IOException
- 如果发生I/O错误 -
IllegalArgumentException
- 如果n < 0
- 参见:
-
close
关闭此输入流并释放与流关联的任何系统资源。- 指定者:
-
close
在接口中AutoCloseable
- 指定者:
-
close
在接口中Closeable
- 覆盖:
-
close
在类中InflaterInputStream
- 抛出:
-
IOException
- 如果发生I/O错误 - 参见:
-
createZipEntry
为指定的条目名称创建一个新的ZipEntry
对象。- 参数:
-
name
- ZIP文件条目名称 - 返回:
- 刚创建的ZipEntry
-