-1

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

我尝试添加输入(Deflater::setInput(newData))并检索压缩字节(::deflate(buffer, startFrom, remainingBytes)),直到我的输出缓冲区完成(例如 1024)。但通常情况下,其他字节仍保留在 deflater 中(例如finished()是错误的),并且无法知道压缩的 newData 的哪一部分在那里。

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

10倍

4

2 回答 2

1

您只能通过迭代过程来做到这一点。而且您可能仍然发现不可能精确到 1024 个字节。

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

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

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

于 2013-09-20T18:56:51.827 回答
0

不幸的是,该解决方案在 Java 7 中,您希望在 Java 7 中使用 syncFlush=true、 DeflaterOutputStream 和 syncrFlush

这允许您flush()流式传输并让接收器读取数据。不幸的是,大多数压缩库都不能通过flush()刷新压缩缓冲区来实现。

于 2013-09-20T20:42:34.683 回答