有没有办法在 Java 中压缩字节缓冲区?

Posted

技术标签:

【中文标题】有没有办法在 Java 中压缩字节缓冲区?【英文标题】:Is there a way to gzip a byte buffer in Java? 【发布时间】:2018-10-09 06:43:49 【问题描述】:

我有相当大的DirectByteBuffer,我想从中生成一个压缩后的DirectByteBuffer,而不将其内容转移到堆中。

标准java.util.Deflater 没有帮助,因为它在byte[] 上运行,根据定义,byte[] 是堆上的。

有没有办法在 Java 中做到这一点?或者我必须直接通过JNI拨打libzip

【问题讨论】:

【参考方案1】:

从 Java 11 开始,有

Deflater.setInput(ByteBuffer input)

Deflater.deflate(ByteBuffer output) 回复 Deflater.deflate(java.nio.ByteBuffer output, int flush)

允许将输入和输出指定为字节缓冲区。当然,这是否真的允许直接堆外处理取决于实现,但快速查看 OpenJDK 发现它有一个用于缓冲区到缓冲区处理的native 方法。

从技术上讲,它不是 GZip,除非您还编写该文件格式的工件,但我想,您主要对压缩而不是文件格式感兴趣。

【讨论】:

非常有趣,谢谢。可以问一下JDK以前的版本吗?我目前使用 JDK8,因为 Scala 在 JDK 9+ 上无法正常工作,因此现在无法迁移。那么 JDK 8 上唯一的解决方案是显式调用 libzip 吗? 我不知道任何早期的解决方案。所以你必须直接调用 libzip 或者更新 JDK。我认为,知道在当前版本中会有一个简单的解决方案会阻止在与旧版本中的原生库接口上花费太多精力......

以上是关于有没有办法在 Java 中压缩字节缓冲区?的主要内容,如果未能解决你的问题,请参考以下文章

在原始仓库接受拉取请求后,有没有办法在 fork 中压缩提交?

如何在 C# 中压缩(和解压缩)字节 []?

在 python 中压缩文件时如何保留目录?

如何仅使用 Windows 的内置功能从脚本中压缩或解压缩?

java 在java8中压缩

如何使用Windows的内置功能从脚本中压缩或解压缩?