存储字符串对象的最压缩方式

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 包裹在 DeflatorOutputStreamObjectOutputStream 以创建文件。 (将整个数组写为单个对象。)然后将 FileInputStream 包裹在 InflatorInputStreamObjectInputStream 内以读取。

【讨论】:

所以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 实现。

以上是关于存储字符串对象的最压缩方式的主要内容,如果未能解决你的问题,请参考以下文章

序列化的方式都有哪些

PHP字符串压缩

days16--集合之Set

js Web存储方式

将 JSON 字符串解析为对象的最简单的 C# 函数是啥? [关闭]

Java--哈夫曼压缩原理