Java-使用Deflater或GZIPOutputStream连接压缩数据

时间:2012-10-28 02:14:02

标签: java compression gzip deflate gzipoutputstream

我们有一堆线程占用一块数据,压缩这些数据然后最终将它们连接成一个大字节数组。如果任何人都可以扩展这个想法或推荐另一种方法,那就太棒了。我目前有两种方法可以尝试,但两种方法都没有按照它们的方式工作:


第一个:我让每个线程的run()函数获取输入数据,然后使用GZIPOutputStream压缩它并将其写入缓冲区。

这个方法的问题是因为每个线程都有一个数据块,当我调用GZIPOutputStream时,它是一个较长的完整数据的一部分,它将那个小块视为拉链的完整数据。这意味着它坚持标题和预告片(我也使用自定义词典,所以我不知道标题现在有多少位,也不知道如何找出)。

我认为你可以手动切断标题和预告片,你只需留下压缩数据(并留下第一个块的标题和最后一个块的预告片)。我对这种方法不确定的另一件事是我是否能做到这一点。如果我将标题留在第一个数据块上,它是否仍然可以正确解压缩。该标头是否仅包含第一个数据块而不是其他连接块的信息?


第二个方法是使用Deflater类。在这种情况下,我可以简单地设置输入,设置字典,然后调用deflate()

问题是,这不是gzip格式。那只是“原始”压缩数据。我不知道如何制作它以便gzip可以识别最终输出。

1 个答案:

答案 0 :(得分:0)

您需要一种方法来写入由其他线程调用的单个GZIPOutputStream,并在它们之间进行适当的协调,以便数据不会混淆。或者让线程写入临时文件,然后在第二阶段汇编并压缩它们。