【问题标题】:Java- concatenating compressed data with Deflater or GZIPOutputStreamJava- 使用 Deflater 或 GZIPOutputStream 连接压缩数据
【发布时间】:2012-10-28 02:14:02
【问题描述】:

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


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

问题在这里,因为每个线程都有一个数据块,当我调用 GZIPOutputStream 时,它是一个较长的完整数据的一部分,它把那个小块当作一个完整的要压缩的数据。这意味着它会粘在标题和预告片上(我也使用自定义字典,所以我不知道标题现在有多少位,也不知道如何找出)。

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


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

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

【问题讨论】:

  • 我刚刚在您的重复问题中回答了这个问题。请不要在这里重复同样的问题。

标签: java compression gzip deflate gzipoutputstream


【解决方案1】:

您需要一个写入单个 GZIPOutputStream 的方法,该方法由其他线程调用,它们之间有适当的协调,这样数据就不会混淆。或者让线程写入临时文件,然后在第二阶段组装和压缩它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 2015-12-29
    • 2013-10-08
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多