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's
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-23
File: mavenbyexample.pdf Size: 1363061 Last Modified 2017-02-15
File: modal_verbs.jpg Size: 31353 Last Modified 2017-03-04
File: sid.jpg Size: 57708 Last Modified 2017-06-05
File: 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
类。