【0】README
0.1) 本文描述转自 core java volume 2, 旨在理解 java流与文件——ZIP文档 的相关知识;
0.2) for source code, please visit https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter1/ZipTest.java
【1】ZipInputStream + ZipOutputStream:
1.1)ZipInputStream: 读入 zip 文件(zip文件 == ZipEntry)
1.2)ZipOutputStream: 写出到 zip 文件;
【2】下面是典型的通读ZIP文件的代码序列:
ZipInputStream zis = new ZipInputStream(new FileInputStream(zipname));
ZipEntry zipEntry;
while((entry = zip.getNextEntry()) != null)
{......zin.closeEntry();
}
zin.close();
2.1 )当希望读入某个 zip 项的内容时, 我们可能并不想使用原生的read 方法, 通常,我们将使用某个更能胜任的流过滤器方法:
Scanner in = new Scanner(zis);
while(in.hasNextLine())do sth with in.nextLine();
- Warning) 在读入单个ZIP 项之后后,不要关闭ZIP输入流, 也不要将 其传递给 可能会关闭它的方法, 否则, 你就不能再读入后序的项了;
2.2) 要写出到ZIP文件, 使用 ZipOutputStream, 对于你希望放入到 ZIP 文件中的每一项, 都应该创建一个 ZipEntry 对象, 并将文件名传递给 ZipEntry的构造器, 它将设置其他诸如文件日期和解压缩方法等参数;
2.3)如果需要:
- step1)覆盖这些设置;
- step2)需要调用 ZipOutputStream 的 putNextEntry 方法来开始写出新文件, 并将文件数据发送到 ZIP流中;
- step3)当完成时, 需要调用 closeEntry;然后你需要对所有你希望存储的文件都重复这个过程, 如以下代码:
FileOutputStream fos = new FileOutputStream("test.zip");
ZipOutputStream zos = new ZipOutputStream(fos);
for all files
{ZipEntry ze = new ZipEntry(filename);zos.putNextEntry(ze);...zout.closeEntry();
}
zout.close();
Attention)
- A1) JAR 文件 只是带有一个特殊项的ZIP文件, 这个项称为清单;
- A2)可以使用 JarInputStream 和 JarOutputStream 类来读写清单项;
- A3) ZIP 流是一个能够展示流的抽象化的强大之处的实例。 当你读入以压缩格式存储的数据时,不必担心边请求边解压数据的问题, 而且ZIP 格式的字节源并非必须是文件, 也可以是来自网络连接的 ZIP 数据;