存储字符串对象的最压缩方式
Posted
技术标签:
【中文标题】存储字符串对象的最压缩方式【英文标题】:Most compressed way to store String Object 【发布时间】:2013-10-06 18:53:07 【问题描述】:我有一个字符串对象,我想将它保存到一个文件中,我不在乎它是保存为纯文本还是二进制文件。我尝试保存为纯文本,大约 27 个字节。然后我尝试了ObjectOutputStream
,它是 24 字节。有没有更好的方法将 String 对象保存到文件中?该字符串是 189:25:600:-324324214& 并打算拥有数千个。这就是我想要压缩它的原因,当然每个字符串都会有所不同
【问题讨论】:
它可能取决于字符串。 您担心压缩一个 24 字节的文件? 字符串是 189:25:600:-324324214& 并打算拥有数千个。这就是我想要压缩它的原因,当然它们会有所不同。 你要读写一个由 1000 万个字符串组成的数组,总长度为 0.27 GiB?我不知道你这样做是为了什么,但你可能想重新考虑你的设计。 这闻起来像XY problem。您最好更详细地描述您正在尝试做的事情,而不是您尝试如何用代码解决它。 【参考方案1】:将 FileOutputStream
包裹在 DeflatorOutputStream
内 ObjectOutputStream
以创建文件。 (将整个数组写为单个对象。)然后将 FileInputStream
包裹在 InflatorInputStream
内 ObjectInputStream
内以读取。
【讨论】:
所以DeflatorStream>FileOutputStream>ObjectOutputStream
?两个流合二为一?
其实三流合一:OutputStream fos = new FileOutputStream(aFile); Deflator deflator = new Deflator(Deflator.BEST_COMPRESSION); OutputStream dos = new DeflatorOutputStream(fos, deflator); OutputStream oos = new ObjectOutputStream(dos)
.
这不适用于小物体,但它适用于我想要的较大物体。【参考方案2】:
以下是一些用于压缩的选项:
-
GZIPOutputStream ("gzip 包装器中的放气")
DeflaterOutputStream ("plain deflate", 推荐通过 gzip 或
zip“包装器”)标准
LZMA Java implementations
jZlib
LZO-Java
Lz4-java and LZ4-HC(Lz4 fast 压缩比合理,LZ4-HC 用于高压缩)
XZ(包含 LZMA2 压缩算法)
snappy-java(使用 JNI,由 Google 根据 LZ77 的想法开发)
到目前为止,我只使用了 1、2、4 和 7 :)。使用 XZ 对我来说似乎是合理的,快速和更高的压缩比并且非常易于使用。
XZOutputStream out = new XZOutputStream(outstream, LZMA2Options);
InputStream in = new XZInputStream(anInputstream);
【讨论】:
一件事是,在我完成保存后,它将与其他三个文件一起归档,因此取消归档两次会使它变得非常慢。我正在使用 LZMA 压缩来做到这一点。GZIPOutputStream
的问题是你必须对它进行子类化才能获得任何压缩。
@user2317720 您可以在写入文件之前将FileOutputStream
包裹在DeflatorOutputStream
中。
@Tedd Hopp,是的,你是对的。 GZIP 流使用特定于 GZIP 文件格式的其他详细信息扩展了 Deflate 实现。以上是关于存储字符串对象的最压缩方式的主要内容,如果未能解决你的问题,请参考以下文章