在 Java 中为对象实现内存中压缩

2022-09-01 01:22:25

我们有这个用例,我们希望压缩和存储对象(在内存中),并在需要时解压缩它们。

我们想要压缩的数据非常多样化,从浮点向量到字符串再到日期。

有人可以建议任何好的压缩技术来做到这一点吗?

我们将压缩的难易程度和解压速度视为最重要的因素。

谢谢。


答案 1

如果你想压缩的实例,你可以让它实现,然后将对象流式传输到压缩的字节数组中,如下所示:MyObjectSerializable

ByteArrayOutputStream baos = new ByteArrayOutputStream();
GZIPOutputStream gzipOut = new GZIPOutputStream(baos);
ObjectOutputStream objectOut = new ObjectOutputStream(gzipOut);
objectOut.writeObject(myObj1);
objectOut.writeObject(myObj2);
objectOut.close();
byte[] bytes = baos.toByteArray();

然后,将背部解压缩到对象中:byte[]

ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
GZIPInputStream gzipIn = new GZIPInputStream(bais);
ObjectInputStream objectIn = new ObjectInputStream(gzipIn);
MyObject myObj1 = (MyObject) objectIn.readObject();
MyObject myObj2 = (MyObject) objectIn.readObject();
objectIn.close();

答案 2

与之前的答案类似,除了我建议你使用DeflatorOutputStream和 InflatorInputStream,因为它们比替代方案更简单/更快/更小。它较小的原因是它只是进行压缩,而替代方案则添加了文件格式扩展名,如CRC检查和标头。

如果大小很重要,您可能希望拥有自己的简单序列化。这是因为 ObjectOutputStream 具有显著的开销,使小对象大得多。(它改进了较大的对象,特别是在压缩时)

例如,a需要81个字节,压缩对于如此少的字节数没有多大帮助。可以显着减少这一点。Integer


推荐