java流与文件——ZIP文档

【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输入流, 也不要将 其传递给 可能会关闭它的方法, 否则, 你就不能再读入后序的项了;

java流与文件——ZIP文档_第1张图片

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();

java流与文件——ZIP文档_第2张图片
Attention)

  • A1) JAR 文件 只是带有一个特殊项的ZIP文件, 这个项称为清单;
  • A2)可以使用 JarInputStream 和 JarOutputStream 类来读写清单项;
  • A3) ZIP 流是一个能够展示流的抽象化的强大之处的实例。 当你读入以压缩格式存储的数据时,不必担心边请求边解压数据的问题, 而且ZIP 格式的字节源并非必须是文件, 也可以是来自网络连接的 ZIP 数据;

你可能感兴趣的:(java)