原文:http://zetcode.com/java/zipinputstream/
Java ZipInputStream教程显示了如何使用ZipInputStream读取 Java 中的 ZIP 文件。
Java ZipInputStream
ZipInputStream是 Java 类,实现用于读取 ZIP 文件格式的文件的输入流过滤器。 它支持压缩和未压缩的条目。
ZIP
ZIP 是一种存档文件格式,支持无损数据压缩。 一个 ZIP 文件可能包含一个或多个已压缩的文件或目录。 Java Archive(JAR)建立在 ZIP 格式上。
ZipInputStream构造器
ZipInputStream具有以下构造器:
ZipInputStream(InputStream in)ZipInputStream(InputStream in, Charset charset)
ZipInputStream getNextEntry
ZipInputStream的getNextEntry()读取下一个 ZIP 文件条目,并将流定位在条目数据的开头。
Java 读取 ZIP 示例
下面的示例读取一个 ZIP 文件的内容。
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 %s %n",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)) {
ZipInputStream是从缓冲的FileInputStream创建的。 当资源不再需要时,try-with-resources将关闭流。
while ((ze = zis.getNextEntry()) != null) {
在while循环中,我们使用getNextEntry()方法浏览 ZIP 文件的条目。 如果没有更多条目,则返回null。
System.out.format("File: %s Size: %d Last Modified %s %n",ze.getName(), ze.getSize(),LocalDate.ofEpochDay(ze.getTime() / MILLS_IN_DAY));
getName()返回条目的名称,getSize()返回条目的未压缩大小,getTime()返回条目的最后修改时间。
File: maven.pdf Size: 6430817 Last Modified 2017-02-23File: mavenbyexample.pdf Size: 1363061 Last Modified 2017-02-15File: modal_verbs.jpg Size: 31353 Last Modified 2017-03-04File: sid.jpg Size: 57708 Last Modified 2017-06-05File: spring-boot-reference.pdf Size: 1946586 Last Modified 2017-06-05
这是一个示例输出。
Java 解压缩 ZIP 示例
在下一个示例中,我们用 Java 解压缩 ZIP 文件。
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 文件的内容,并使用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 读取文本文件, Java HashMap教程, Java ArrayList教程, Java static关键字, Java 中的HashMap迭代, Java8 forEach教程,用 Java 读写 ICO 图像, Java 教程, 用 Java 显示图像。
