使用Java附加到压缩流

时间:2015-05-20 06:33:37

标签: java stream compression append

我们目前有一些数据记录。该日志仅附加,但在每个附加项上,从头开始扫描整个日志以进行一些一致性检查(某些事件组合会触发警报)。

现在,我们希望将该日志转换为压缩日志。单个日志条目通常是几十个字节,因此它们不能很好地压缩。但是,整个日志流确实压缩得很好,存在足够的冗余。

理论上,对压缩流的添加应该很容易,因为压缩编码器的状态可以在扫描(和解压缩)日志时重建。

我们目前的方法是在扫描和解压缩阶段运行具有相同设置的压缩器,为其提供刚刚解压缩的数据(假设它将构建相同的状态)。

但是,我们知道这不是最佳选择。我们希望重新使用在解压缩期间构建的状态来压缩新数据。所以问题是:我们如何以一种我们不需要将解压缩数据提供给压缩器来构建状态的方式实现(de)压缩,但是可以重新使用解压缩器的状态来压缩新数据我们追加?

(遗憾的是,我们需要在java中执行此操作,这限制了可用API的数量。但是,包含免费/开源第三方代码是一种选择。)

1 个答案:

答案 0 :(得分:0)

您可能没有Java所需的接口,但可以使用zlib完成此操作。您可以编写自己的Java接口到zlib来执行此操作。

扫描时,您将使用队列保留最后32K的未压缩数据。您将使用Z_BLOCK中的inflate()扫描压缩文件。这将停止在每个deflate块。当您到达最后一个块(由块的第一个位标识)时,您将保存该块的未压缩数据,以及保存在队列中的32K之前的块。您还可以保存前一个块中未完成一个字节的最后一位(0..7位)。然后,您可以将新的日志条目添加到最后一块未压缩的数据中,然后使用前面带有deflateSetDictionary()的32K重新压缩该部分。您可以使用deflatePrime()在位边界上开始压缩。这将覆盖带有新压缩块或块的最后一个压缩块。