Java Deflater:我可以创建预定义大小的压缩块吗?

时间:2013-09-20 16:25:22

标签: java compression

通过使用Java Deflater (1.6 is needed)我想生成特定大小的压缩块(例如,总是1024字节的压缩块)。有可能吗?

我尝试添加输入(Deflater::setInput(newData))并检索压缩字节(::deflate(buffer, startFrom, remainingBytes)),直到我的输出缓冲区满足为止(例如1024)。但通常会发生其他字节保留在deflater中(例如finished()为false)并且无法知道压缩newData的哪个部分存在。

此外,接收器可以在不同时刻接收数据包,它所拥有的唯一信息是压缩块大小,因此每个数据包都需要自动保持一致。

10倍

2 个答案:

答案 0 :(得分:1)

您只能通过迭代过程完成此操作。你可能仍然觉得不可能达到1024字节。

方法是首先压缩,直到你得到超过1024个字节。然后取压缩输出的前1019个字节(或者如果nowrap为真,则为前1023个字节)并解压缩,直到不再返回数据为止。然后再次使用您获得的字节进行压缩。你可能会得到正好1024字节,或者你会得到非常接近的东西。根据输出是小于还是大于您想要的值来调整输入或向下输入的字节数,然后再次压缩。小心编写代码,以便迭代始终完成。

您可能会发现添加一个未压缩字节会带来1023到1025个压缩字节的情况,在这种情况下,您需要满足1023个字节。或者您可以使用不同的压缩级别再次尝试。

顺便说一句,如果将输出限制为1K,则不会获得非常好的压缩效果。良好的压缩取决于对大量历史的访问。您应该考虑在多个1K数据包上发送更长的压缩流,如果数据包以不同的顺序到达,请确保在另一端正确地重新排序数据包以进行解压缩。

答案 1 :(得分:0)

不幸的是,解决方案在Java 7中,你想要syncFlush = true,DeflaterOutputStream with syncrFlush in Java 7

这允许您flush()流并让接收方读取数据。遗憾的是,大多数压缩库都没有通过刷新压缩缓冲区来尊重flush()

相关问题