我正在使用一个返回GZIP字符串的系统(不是二进制或流)。例如,gzip:H4sIAAAAAAAAALS9665wyXEd9i7zm21U37vnVwwZAREEAZJYgBEjMKq6uiVLNimQlBDRyLtnrX3GD+ACIlEDznyaffbpXV21Vl1W/bdf/vKv/3R/+fWXf/4n17/cX373y/l7/cPfXf+3f/nl1zxWrmW2Vfeev/vlL/p3f/7l1//4f//uF7vvj3+6f/unP/zy63/75T/9p//+CPz97375F/0v//zb3/2q/1X/+sc...
(必须省略整个字符串,因为它很长)。我能够验证其GZIP压缩,因为https://www.multiutil.com/gzip-to-text-decompress/等工具返回预期的未压缩字符串。
然而,我试图找到一种方法来处理这个字符串在Java。
我试过了
final GZIPInputStream gzipInput = new GZIPInputStream(new ByteArrayInputStream(compressedString.getBytes()));
但是这行是抛出java.util.zip.ZipException: Not in GZIP format
我在这里搜索过,但是类似的帖子是关于GZIP何时在http响应中并且可以从流中读取。在我的情况下,我的GZIP数据已经作为字符串给了我。
请指教,谢谢。
This:
H4sIAAAAAAAACvNIzcnJVwjPL8pJAQBWsRdKCwAAAA = =
是Base64。这是一种编码,允许您将字节置于字符形式,这样字符就可以在任何和所有纯文本媒体中存活。
效率极低,膨胀你的数据大小:每3个字节需要4个字符(所以,至少4个字节的传输)。
你在这里看到的可能是经过这个过程的数据:
- 首先,GZip此数据。
- 第二,Base64压缩数据。
这很奇怪-首先,有效地存储它,然后,非常低效地发送它。只有当它在不能处理字节的媒体(如基本JSON或HTTP头)中才有意义,然后您可能想要考虑这种媒体。
无论如何,要返回到原始数据,应用相同的步骤,反过来:
- 首先,去base64,它给你一个字节数组。
- 接下来,将其作为ByteArrayInputStream的基础,并将其扔给GZIPInputStream。
Base64被嵌入java。
byte[] compressedData = Base64.getDecoder().decode("H4sIAAAAAAAACvNIzcnJVwjPL8pJAQBWsRdKCwAAAA=="));
var gz = new GZIPInputStream(new ByteArrayInputStream(compressedData));