【发布时间】:2016-02-01 22:24:54
【问题描述】:
我正在使用ZipOutputStream 压缩一堆文件,这些文件混合了已压缩的格式以及许多大型高度可压缩格式(如纯文本)。
大多数已经压缩的格式都是大文件,花费 cpu 和内存重新压缩它们是没有意义的,因为它们永远不会变小,有时会在极少数情况下稍微变大。
我在检测到预压缩文件时尝试使用.setMethod(ZipEntry.STORED),但它抱怨我需要为这些文件提供size, compressedSize and crc。
我可以使用以下方法使其工作,但这需要我阅读文件两次。一次计算CRC32,然后再次将文件实际复制到ZipOutputStream。
// code that determines the value of method omitted for brevity
if (STORED == method)
{
fze.setMethod(STORED);
fze.setCompressedSize(fe.attributes.size());
final HashingInputStream his = new HashingInputStream(Hashing.crc32(), fis);
ByteStreams.copy(his,ByteStreams.nullOutputStream());
fze.setCrc(his.hash().padToLong());
}
else
{
fze.setMethod(DEFLATED);
}
zos.putNextEntry(fze);
ByteStreams.copy(new FileInputStream(fe.path.toFile()), zos);
zos.closeEntry();
有没有一种方法可以提供这些信息而无需两次读取输入流?
【问题讨论】:
标签: java zipoutputstream