Java - 使用Deflater写入GZIP文件

时间:2011-10-26 18:03:17

标签: java gzip checksum

我在使用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);

1 个答案:

答案 0 :(得分:1)

Deflater类有三个构造函数。具有两个参数的一个使用布尔值,如果为true,则表示不应使用ZLIB头和校验和字段,这是GZIP需要的。另外两个构造函数(一个没有args,另一个只指定压缩级别)默认使用那些头和校验和字段。换句话说,它就像带有false的双参数构造函数。也许尝试使用布尔值并将其设置为true?

Here's the constructor doc.