我在使用Deflater编写GZIP文件时遇到问题。我创建了一个默认标头,并使用CRC32来跟踪校验和。
我正在压缩的文件小于我的缓冲区,但是我得到的压缩器输出比它应该大约200字节(gzip创建一个457字节的文件,而我的代码创建了652字节的文件。我打印了compressedSize,它说它是634字节)我在我的最终文件上做了一个hexdump,它说我的预告片和我的主文件都不正确,但我的标题是正确的。我不允许使用GZIPOutputStream进行此分配,但我使用它的代码来编写标题和预告片。读入的字节数是正确的。
“manage”对象是一个对象,它在同步事物中执行System.in和System.out的读写操作(这是用于多线程),我验证了它们应该按顺序读写文件。我查看了GZIPOutputStream源和DeflaterOutputStream源,我的代码看起来很相似,所以我不确定为什么我的压缩器给了我这么大的压缩字节数组。我玩Deflater级别和策略,但他们给了我相同的结果。
编辑:我的Deflater的构造函数是 Deflater压缩器=新Deflater(Deflater.DEFAULT_LEVEL,true);
CRC32 checksum = new CRC32();
checksum.reset();
int uncompressedLength = 0;
uncompressedLength = manage.read(buff, threadNum, prime);
if (uncompressedLength > 0)
{
checksum.update(buff, 0, uncompressedLength);
compressor.setInput(buff);
compressor.finish();
byte[] output = new byte[BUFFER_SIZE];
compressor.deflate(output);
int compressedDataLength = (int) compressor.getBytesWritten();
manage.write(output, compressedDataLength, threadNum, (int) checksum.getValue(), uncompressedLength);
答案 0 :(得分:1)
Deflater类有三个构造函数。具有两个参数的一个使用布尔值,如果为true,则表示不应使用ZLIB头和校验和字段,这是GZIP需要的。另外两个构造函数(一个没有args,另一个只指定压缩级别)默认使用那些头和校验和字段。换句话说,它就像带有false的双参数构造函数。也许尝试使用布尔值并将其设置为true?