ZetCode

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

ZipInputStreamgetNextEntry 读取下一个 ZIP 文件条目,并将流定位到条目数据的开头。

Java 读取 ZIP 示例

以下示例读取 ZIP 文件的内容。

com/zetcode/JavaReadZip.java
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);

我们从文件创建一个 FileInputStreamFileInputStream 用于读取原始字节流。

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 文件。

com/zetcode/JavaUnzip.java
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 文件的内容,并使用 FileOutputStreamBufferedOutputStream 将内容写入目录。

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 - 语言参考

在本文中,我们介绍了 Java ZipInputStream 类。 我们创建了两个示例来读取 ZIP 文件和解压缩 ZIP 文件。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有Java教程