阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

操作Zip

30次阅读
没有评论

共计 1409 个字符,预计需要花费 4 分钟才能阅读完成。

ZipInputStream是一种FilterInputStream,它可以直接读取 zip 包的内容:

┌───────────────────┐
│    InputStream    │
└───────────────────┘
          ▲
          │
┌───────────────────┐
│ FilterInputStream │
└───────────────────┘
          ▲
          │
┌───────────────────┐
│InflaterInputStream│
└───────────────────┘
          ▲
          │
┌───────────────────┐
│  ZipInputStream   │
└───────────────────┘
          ▲
          │
┌───────────────────┐
│  JarInputStream   │
└───────────────────┘

另一个 JarInputStream 是从 ZipInputStream 派生,它增加的主要功能是直接读取 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 = ...
    for (File file : files) {zip.putNextEntry(new ZipEntry(file.getName()));
        zip.write(Files.readAllBytes(file.toPath()));
        zip.closeEntry();}
}

上面的代码没有考虑文件的目录结构。如果要实现目录层次结构,new ZipEntry(name)传入的 name 要用相对路径。

小结

ZipInputStream可以读取 zip 格式的流,ZipOutputStream可以把多份数据写入 zip 包;

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

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-08-05发表,共计1409字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中