首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Java中有效地压缩10-1000个字符的字符串?

在Java中有效地压缩10-1000个字符的字符串?
EN

Stack Overflow用户
提问于 2011-04-04 10:38:28
回答 3查看 14.7K关注 0票数 8

我需要将10到1000个字符的字符串(用已知但可变的语言编写)压缩到单独的UDP数据包中。

Java中可用的哪些压缩算法非常适合这项任务?

有没有开放源码的Java库可以做到这一点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-04 10:46:00

“视情况而定”。

我会从主要的候选者开始:LZMA ("7-zip"),deflate (直接,zlib: deflate +小包装器,gzip: deflate +稍微大一点的包装器,zip: deflate +更大的包装器),bzip2 (我怀疑这在这里会有那么好,在相对较大的窗口下工作得最好),甚至可能是其他LZ*分支之一,比如has an RFC for IP Payload compression,但是...

...run使用几种不同的方法,根据实际数据和压缩/吞吐量进行一些分析。Java有GZIPOutputStream (“gzip包装器中的放气”)和DeflaterOutputStream (“普通放气”,推荐优于gzip或zip "wrappers")标准,还有LZMA Java implementations (只需要压缩器,而不是容器),所以这些都是很容易模拟的。

如果在分组之间存在规律性,则可以利用这一点--例如,建立高速缓存映射、霍夫曼表,或者仅仅修改其它算法之一的“窗口”--但是分组丢失和“解压缩性”可能需要被考虑。然而,沿着这条路线走下去会增加更多的复杂性。更多帮助压缩机的想法可以在SO: How to find a good/optimal dictionary for zlib 'setDictionary' when processing a given set of data?上找到。

此外,协议应该有一个简单的零压缩“回退”,因为一些特别小的随机数据可能实际上是不可压缩的,或者可能是"compress" to a larger size (zlib实际上有这个保护,但也有“包装器开销”,所以对于非常小的数据,单独编码会更好)。对于如此小的尺寸,还需要考虑压缩数据的“包装器”的开销--比如gzip或zip。对于少于~100个字符的字符串数据,这一点尤其重要。

祝你编码愉快。

要考虑的另一件事是用于将字符推入输出流的编码。我会先从UTF-8开始,但这可能并不总是理想的。

请参阅建议使用SMAZSO: Best compression algorithm for short text strings,但我不知道此算法将如何转换为unicode / binary。

还要考虑并不是所有的deflate (或其他格式)实现都是平等的。就小数据的效率而言,我不太了解Java的标准deflate与第三方(比如JZlib)相比,但考虑一下Compressing Small Payloads [.NET],它在“相同的压缩”格式中显示了相当大的负数。这篇文章的结尾也很好:

...不管怎样,压缩通常是最有益的,并确定哪个有效负载(压缩的或未压缩的)具有最小的大小,并包含一个小标记来指示是否需要解压缩。我的最终结论:始终使用真实世界的数据进行测试并衡量好处,否则最终可能会有一些惊喜!

祝你编码愉快。这一次是真的。

票数 10
EN

Stack Overflow用户

发布于 2011-04-04 10:46:02

最简单的做法是在ByteArrayOutputStream之上分层,因为这是内置到JDK中的,使用

代码语言:javascript
运行
复制
ByteArrayOutputStream baos = new ByteArrayOutputStream();
GZIPOutputStream zos = new GZIPOutputStream(baos);

zos.write(someText.getBytes());
zos.finish();
zos.flush();


byte[] udpBuffer = baos.toByteArray();

也许有其他算法可以做得更好,但我会先尝试一下,看看它是否适合您的需求,因为它不需要任何额外的jars,并且做得很好。

票数 5
EN

Stack Overflow用户

发布于 2011-04-04 15:14:02

大多数标准的压缩算法在少量数据的情况下不能很好地工作。通常有一个报头和一个校验和,压缩预热需要时间。即,它基于它所看到的数据来构建数据字典。

由于这个原因,您可以发现

  • 小数据包可能更小或相同大小,但没有压缩。
  • 简单的应用程序/协议特定的压缩更好
  • 您必须为压缩算法提供预先构建的数据字典,并尽可能剥离报头。

对于小的数据包,我通常使用第二种选择。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5534070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档