Java从字符串提取GZIP值解压时报Not in GZIP format错误如何解决
问题解决:GZIP解压字符串抛出Not in GZIP format错误
你遇到的报错根本原因是:compressed_value属性存储的是Base64编码后的GZIP压缩字节串,并非直接的GZIP字节流对应的字符串。你当前代码直接调用compressedValue.getBytes()获取的是Base64文本本身的字节,不符合GZIP格式规范,因此抛出异常。
解决步骤如下:
- 第一步:先对
compressed_value做Base64解码,得到原始的GZIP压缩字节数组 - 第二步:将解码后的字节数组传入
GZIPInputStream执行解压流程
Java 8及以上版本内置java.util.Base64工具类,无需引入第三方依赖,修正后的示例代码如下:
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Base64; import java.util.zip.GZIPInputStream; public class Main { public static void main(String[] args) throws IOException { String compressedValue = "H4sIAAAAAAAA/wtOzC3ISVUoSa0oUSjJSCxRyFRITswrUUhJLU4tykzMyaxK1VFISczLVQQAkIb0eioAAAA="; try { final int BUFFER_SIZE = 32; // 新增Base64解码步骤,获取原始GZIP压缩字节 byte[] gzipBytes = Base64.getDecoder().decode(compressedValue); ByteArrayInputStream is = new ByteArrayInputStream(gzipBytes); GZIPInputStream gis = new GZIPInputStream(is); byte[] data = new byte[BUFFER_SIZE]; int bytesRead; ByteArrayOutputStream baos = new ByteArrayOutputStream(); while ((bytesRead = gis.read(data)) != -1) { baos.write(data, 0, bytesRead); } gis.close(); is.close(); baos.close(); System.out.println(baos.toString("UTF-8")); } catch (IOException ex) { ex.printStackTrace(); } } }
如果你使用的是低于Java 8的版本,可以使用Apache Commons Codec的org.apache.commons.codec.binary.Base64类完成解码逻辑,API用法基本一致。
内容的提问来源于stack exchange,提问作者Clovis Ignacio Ferreira
相关产品推荐
相关产品推荐

