Java ZipInputStream
上次修改时间:2022 年 7 月 15 日
Java ZipInputStream 教程展示了如何在 Java 中使用 ZipInputStream
读取 ZIP 文件。
Java ZipInputStream
ZipInputStream
是一个 Java 类,它实现了一个输入流过滤器,用于读取 ZIP 文件格式的文件。它支持压缩和未压缩的条目。
ZIP
ZIP 是一种支持无损数据压缩的归档文件格式。一个 ZIP 文件可能包含一个或多个已被压缩的文件或目录。Java 归档 (JAR) 构建于 ZIP 格式之上。
ZipInputStream 构造函数
ZipInputStream
具有以下构造函数
ZipInputStream(InputStream in) ZipInputStream(InputStream in, Charset charset)
ZipInputStream getNextEntry
ZipInputStream
的 getNextEntry
读取下一个 ZIP 文件条目,并将流定位到条目数据的开头。
Java 读取 ZIP 示例
以下示例读取 ZIP 文件的内容。
package com.zetcode; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; import java.time.LocalDate; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; public class JavaReadZip { private final static Long MILLS_IN_DAY = 86400000L; public static void main(String[] args) throws IOException { String fileName = "src/resources/myfile.zip"; try (FileInputStream fis = new FileInputStream(fileName); BufferedInputStream bis = new BufferedInputStream(fis); ZipInputStream zis = new ZipInputStream(bis)) { ZipEntry ze; while ((ze = zis.getNextEntry()) != null) { System.out.format("File: %s Size: %d last modified: %d", ze.getName(), ze.getSize(), LocalDate.ofEpochDay(ze.getTime() / MILLS_IN_DAY)); } } } }
该示例使用 ZipInputStream
读取给定的 ZIP 文件,并将其内容打印到终端。 我们打印文件名、大小和上次修改时间。
String fileName = "src/resources/myfile.zip";
ZIP 文件位于 src/resources/
目录中。
try (FileInputStream fis = new FileInputStream(fileName);
我们从文件创建一个 FileInputStream
。 FileInputStream
用于读取原始字节流。
BufferedInputStream bis = new BufferedInputStream(fis);
为了获得更好的性能,我们将 FileInputStream
传递到 BufferedInputStream
中。
ZipInputStream zis = new ZipInputStream(bis)) {
从缓冲的 FileInputStream
创建一个 ZipInputStream
。 try-with-resources 在不需要时关闭流。
while ((ze = zis.getNextEntry()) != null) {
在一个 while 循环中,我们使用 getNextEntry
方法遍历 ZIP 文件的条目。 如果没有更多条目,则返回 null。
System.out.format("File: %s Size: %d last modified: %d", ze.getName(), ze.getSize(), LocalDate.ofEpochDay(ze.getTime() / MILLS_IN_DAY));
getName
返回条目的名称,getSize
返回条目的未压缩大小,getTime
返回条目的上次修改时间。
Java 解压缩 ZIP 示例
在下一个示例中,我们在 Java 中解压缩一个 ZIP 文件。
package com.zetcode; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.nio.file.Path; import java.nio.file.Paths; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; public class JavaUnzip { public static void main(String args[]) throws Exception { byte[] buffer = new byte[2048]; Path outDir = Paths.get("src/resources/output/"); String zipFileName = "src/resources/myfile.zip"; try (FileInputStream fis = new FileInputStream(zipFileName); BufferedInputStream bis = new BufferedInputStream(fis); ZipInputStream stream = new ZipInputStream(bis)) { ZipEntry entry; while ((entry = stream.getNextEntry()) != null) { Path filePath = outDir.resolve(entry.getName()); try (FileOutputStream fos = new FileOutputStream(filePath.toFile()); BufferedOutputStream bos = new BufferedOutputStream(fos, buffer.length)) { int len; while ((len = stream.read(buffer)) > 0) { bos.write(buffer, 0, len); } } } } } }
该示例使用 ZipInputStream
读取给定 ZIP 文件的内容,并使用 FileOutputStream
和 BufferedOutputStream
将内容写入目录。
Path outDir = Paths.get("src/resources/output/");
这是我们提取 ZIP 文件内容的目录。
while ((entry = stream.getNextEntry()) != null) {
在第一个 while 循环中,我们遍历 ZIP 文件的条目。
while ((len = stream.read(buffer)) > 0) { bos.write(buffer, 0, len); }
在第二个 while 循环中,我们读取条目并将它们写入输出流。
来源
在本文中,我们介绍了 Java ZipInputStream
类。 我们创建了两个示例来读取 ZIP 文件和解压缩 ZIP 文件。
作者
列出所有Java教程。