を使用してZipOutputStream
、既に圧縮された形式と、プレーンテキストのような圧縮性の高い多くの大きな形式が混在する一連のファイルを圧縮しています。
すでに圧縮された形式のほとんどは大きなファイルであり、再圧縮に CPU とメモリを費やすことは意味がありません。
.setMethod(ZipEntry.STORED)
事前に圧縮されたファイルを検出したときに使用しようとしていますがsize, compressedSize and crc
、それらのファイルに を提供する必要があると不平を言っています。
次のアプローチで動作させることができますが、これにはファイルを 2 回読み取る必要があります。を計算して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();