【发布时间】:2012-10-28 02:14:02
【问题描述】:
我们有一堆线程来获取一个数据块,压缩这些数据,然后最终将它们连接成一个大字节数组。如果有人可以扩展这个想法或推荐另一种方法,那就太棒了。我目前有两种方法正在尝试,但都没有按应有的方式工作:
第一个:我让每个线程的run() 函数获取输入数据,然后使用GZIPOutputStream 对其进行压缩并将其写入缓冲区。
问题在这里,因为每个线程都有一个数据块,当我调用 GZIPOutputStream 时,它是一个较长的完整数据的一部分,它把那个小块当作一个完整的要压缩的数据。这意味着它会粘在标题和预告片上(我也使用自定义字典,所以我不知道标题现在有多少位,也不知道如何找出)。
我认为您可以手动切断标头和预告片,然后只剩下压缩数据(并留下第一个块的标头和最后一个块的预告片)。我不确定这种方法的另一件事是我是否可以做到这一点。如果我将标题留在第一个数据块上,它是否仍能正确解压缩。该标头是否仅包含数据的第一个块而不包含其他连接块的信息?
第二种方法是使用Deflater类。在这种情况下,我可以简单地设置输入,设置字典,然后调用deflate()。
问题是,这不是 gzip 格式。那只是“原始”压缩数据。我不知道如何制作,以便 gzip 可以识别最终输出。
【问题讨论】:
-
我刚刚在您的重复问题中回答了这个问题。请不要在这里重复同样的问题。
标签: java compression gzip deflate gzipoutputstream