搜索 K
Appearance
博客正在加载中...
Appearance
ZipInputStream 是一种 FilterInputStream。它可以直接读取 zip 包的内容。
┌───────────────────┐
│ InputStream │
└───────────────────┘
▲
│
┌───────────────────┐
│ FilterInputStream │
└───────────────────┘
▲
│
┌───────────────────┐
│InflaterInputStream│
└───────────────────┘
▲
│
┌───────────────────┐
│ ZipInputStream │
└───────────────────┘
▲
│
┌───────────────────┐
│ JarInputStream │
└───────────────────┘JarInputStream 从 ZipInputStream 派生,它增加的主要功能是直接读取 jar 文件里面的 MANIFEST.MF 文件。因为本质上 jar 包就是 zip 包,只是额外附加了一些固定的描述文件。
我们先创建一个 HelloWorld.txt 文件,文件里的内容为 HelloWorld,并通过压缩工具压缩该文件,形成一个压缩包
我们编写代码来读取其内容:
import java.io.FileInputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class IODemo7Zip {
public static void main(String[] args) throws IOException{
try (
FileInputStream file = new FileInputStream("readme.zip");
ZipInputStream zip = new ZipInputStream(file)) {
ZipEntry entry = null;
while(null != ( entry = zip.getNextEntry())){
if(!entry.isDirectory()){
int n;
while( -1 != (n = zip.read())){
System.out.println(n);
}
}
}
}
}
}一个 ZipEntry 表示一个压缩文件或目录,如果是压缩文件,我们就用 read() 方法不断读取,直到返回 -1(表明已读完一个文件,准备读下一个文件了)。
输出结果为 HelloWorld 的 ASCII 码:
72
101
108
108
111
87
111
114
108
100我们可以使用 ZipOutputStream 将内容写入到 zip 包。ZipOutputStream 是一种 FilterOutputStream。
我们要先创建一个 ZipOutputStream,通常是包装一个 FileOutputStream,然后,每写入一个文件前,先调用 putNextEntry(),然后用 write() 写入 byte[] 数据,写入完毕后调用 closeEntry() 结束这个文件的打包。
File file = new File("readme.txt");
File fileZip = new File("readme.zip");
try (ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(fileZip))) {
zip.putNextEntry(new ZipEntry(file.getPath()));
zip.write(Files.readAllBytes(file.toPath()));
zip.closeEntry();
} catch (Exception e) {
e.printStackTrace();
}运行后会在本目录下生成一个 zip 压缩包,打开压缩包可以看到有 readme.txt。
ZipInputStream 可以读取 zip 格式的流,ZipOutputStream 可以把多份数据写入 zip 包;
配合 FileInputStream 和 FileOutputStream 就可以读写 zip 文件。