Java笔记之操作Zip

操作Zip

ZipInputStream是一种FilterInputStream,它可以直接读取zip包的内容
派生关系:JarInputStream->ZipInputStream->FilterInputStream->InputStream.
JarInputStream增加的主要功能是直接读取jar文件里面的MANIFEST.MF文件。因为本质上jar包就是一个zip包,只是额外附加了一些固定的描述文件。

读取zip包

来看看ZipInputStream的基本用法。
我们要创建一个ZipInputStream,通常是传入一个FileInputStream作为数据源,然后,循环调用getNextEntry(),直到返回null,表示zip流结束。
一个ZipEntry表示一个压缩文件或目录,如果是压缩文件,我们就用read()方法不断读取,直到返回-1:

try (ZipInputStream zip = new ZipInputStream(new FileInputStream())) {
    ZipEntry entry = null;
    while ((entry = zip.getNextEntry()) != null) {
        String name = entry.getName();
        if (!entry.isDirectory()) {//不是目录
            int n;
            while ((n = zip.read()) != -1) {
                //一些操作
            }
        }
    }
}

写入zip包

相反的ZipOutputStream是一种FilterOutputStream,它可以直接将内容写入到zip包。我们要先创建一个ZipOutputStream,通常是封装一个FileOutputStream,然后,每写入一个文件前,先调用putNextEntry(),然后用write()写入byte[]数据,写入完毕后调用closeEntry()结束这个文件的打包。

try (ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(...))) {
    File[] files = file.listfile();
    for (File file : files) {
        zip.putNextEntry(new ZipEntry(file.getName()));
        zip.write(getFileDataAsBytes(file));
        zip.closeEntry();
    }
}

配合FileInputStreamFileOutputStream就可以读写zip文件。

你可能感兴趣的:(java)