原文:http://zetcode.com/java/zipinputstream/

Java ZipInputStream教程显示了如何使用ZipInputStream读取 Java 中的 ZIP 文件。

Java ZipInputStream

ZipInputStream是 Java 类,实现用于读取 ZIP 文件格式的文件的输入流过滤器。 它支持压缩和未压缩的条目。

ZIP

ZIP 是一种存档文件格式,支持无损数据压缩。 一个 ZIP 文件可能包含一个或多个已压缩的文件或目录。 Java Archive(JAR)建立在 ZIP 格式上。

ZipInputStream构造器

ZipInputStream具有以下构造器:

  1. ZipInputStream(InputStream in)
  2. ZipInputStream(InputStream in, Charset charset)

ZipInputStream getNextEntry

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

Java 读取 ZIP 示例

下面的示例读取一个 ZIP 文件的内容。

JavaReadZip.java

  1. package com.zetcode;
  2. import java.io.BufferedInputStream;
  3. import java.io.FileInputStream;
  4. import java.io.IOException;
  5. import java.time.LocalDate;
  6. import java.util.zip.ZipEntry;
  7. import java.util.zip.ZipInputStream;
  8. public class JavaReadZip {
  9. private final static Long MILLS_IN_DAY = 86400000L;
  10. public static void main(String[] args) throws IOException {
  11. String fileName = "src/resources/myfile.zip";
  12. try (FileInputStream fis = new FileInputStream(fileName);
  13. BufferedInputStream bis = new BufferedInputStream(fis);
  14. ZipInputStream zis = new ZipInputStream(bis)) {
  15. ZipEntry ze;
  16. while ((ze = zis.getNextEntry()) != null) {
  17. System.out.format("File: %s Size: %d Last Modified %s %n",
  18. ze.getName(), ze.getSize(),
  19. LocalDate.ofEpochDay(ze.getTime() / MILLS_IN_DAY));
  20. }
  21. }
  22. }
  23. }

该示例使用ZipInputStream读取给定的 ZIP 文件,并将其内容打印到终端。 我们打印文件名,文件大小和最后修改时间。

  1. String fileName = "src/resources/myfile.zip";

ZIP 文件位于src/resources/目录中。

  1. try (FileInputStream fis = new FileInputStream(fileName);

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

  1. BufferedInputStream bis = new BufferedInputStream(fis);

为了获得更好的性能,我们将FileInputStream传递到BufferedInputStream中。

  1. ZipInputStream zis = new ZipInputStream(bis)) {

ZipInputStream是从缓冲的FileInputStream创建的。 当资源不再需要时,try-with-resources将关闭流。

  1. while ((ze = zis.getNextEntry()) != null) {

while循环中,我们使用getNextEntry()方法浏览 ZIP 文件的条目。 如果没有更多条目,则返回null

  1. System.out.format("File: %s Size: %d Last Modified %s %n",
  2. ze.getName(), ze.getSize(),
  3. LocalDate.ofEpochDay(ze.getTime() / MILLS_IN_DAY));

getName()返回条目的名称,getSize()返回条目的未压缩大小,getTime()返回条目的最后修改时间。

  1. File: maven.pdf Size: 6430817 Last Modified 2017-02-23
  2. File: mavenbyexample.pdf Size: 1363061 Last Modified 2017-02-15
  3. File: modal_verbs.jpg Size: 31353 Last Modified 2017-03-04
  4. File: sid.jpg Size: 57708 Last Modified 2017-06-05
  5. File: spring-boot-reference.pdf Size: 1946586 Last Modified 2017-06-05

这是一个示例输出。

Java 解压缩 ZIP 示例

在下一个示例中,我们用 Java 解压缩 ZIP 文件。

JavaUnzip.java

  1. package com.zetcode;
  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedOutputStream;
  4. import java.io.FileInputStream;
  5. import java.io.FileOutputStream;
  6. import java.nio.file.Path;
  7. import java.nio.file.Paths;
  8. import java.util.zip.ZipEntry;
  9. import java.util.zip.ZipInputStream;
  10. public class JavaUnzip {
  11. public static void main(String args[]) throws Exception {
  12. byte[] buffer = new byte[2048];
  13. Path outDir = Paths.get("src/resources/output/");
  14. String zipFileName = "src/resources/myfile.zip";
  15. try (FileInputStream fis = new FileInputStream(zipFileName);
  16. BufferedInputStream bis = new BufferedInputStream(fis);
  17. ZipInputStream stream = new ZipInputStream(bis)) {
  18. ZipEntry entry;
  19. while ((entry = stream.getNextEntry()) != null) {
  20. Path filePath = outDir.resolve(entry.getName());
  21. try (FileOutputStream fos = new FileOutputStream(filePath.toFile());
  22. BufferedOutputStream bos = new BufferedOutputStream(fos, buffer.length)) {
  23. int len;
  24. while ((len = stream.read(buffer)) > 0) {
  25. bos.write(buffer, 0, len);
  26. }
  27. }
  28. }
  29. }
  30. }
  31. }

该示例使用ZipInputStream读取给定 ZIP 文件的内容,并使用FileOutputStreamBufferedOutputStream将该内容写入目录。

  1. Path outDir = Paths.get("src/resources/output/");

这是我们提取 ZIP 文件内容的目录。

  1. while ((entry = stream.getNextEntry()) != null) {

在第一个while循环中,我们浏览 ZIP 文件的条目。

  1. while ((len = stream.read(buffer)) > 0) {
  2. bos.write(buffer, 0, len);
  3. }

在第二个while循环中,我们读取条目并将其写入输出流。

在本教程中,我们介绍了 Java ZipInputStream类。 我们创建了两个示例来读取 ZIP 文件和解压缩 ZIP 文件。 您可能也对相关教程感兴趣:Java 读取文本文件Java HashMap教程Java ArrayList教程Java static关键字Java 中的HashMap迭代Java8 forEach教程用 Java 读写 ICO 图像Java 教程用 Java 显示图像