解决java.util.zip.ZipException: Not in GZIP format报错问题

 更新时间:2023年12月21日 10:18:11   作者:李治鸿  
这篇文章主要介绍了解决java.util.zip.ZipException: Not in GZIP format报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

java.util.zip.ZipException: Not in GZIP format报错

最近在对接第三方接口时遇到了一个报错,java.util.zip.ZipException: Not in GZIP format,因为公司在推行使用GPT提高开发效率,所以我遇事不决先问GPT

GPT给我的答案

java.util.zip.ZipException: Not in GZIP format 的报错一般是由以下几个原因导致的:

> 1. 压缩文件格式不正确。也就是说,你试图解压一个不是GZIP格式的文件。确保要解压的文件确实使用GZIP格式进行压缩。

> 2. 文件内容已损坏。有可能压缩时引入了错误,或在传输过程中文件被篡改了。导致文件内容已经损坏,无法正常解压。

> 3. 编码格式不匹配。GZIP格式只支持部分编码,如果压缩时使用了不支持的编码,也可能导致解压失败。

> 4. Java 版本不匹配。GZIP格式在不同的Java版本中实现可能有差异,如果压缩时使用的是另一个Java版本,也可能解压失败。

> 5. 代码存在bug。你的解压代码可能存在bug,导致无法正常读取GZIP格式。可以对比官方实现,检查代码是否存在问题。

为了解决这个报错,你可以分别检查以下几点:

> 1. 检查原压缩文件的确使用GZIP格式。如使用zip -d查看压缩格式。

> 2. 使用文件校验器 检查压缩文件是否被篡改。

> 3. 在解压前使用工具来检查文件是否损坏。

> 4. 检查压缩和解压所用的编码格式是否一致。

> 5. 验证压缩和解压所用的Java版本是否匹配。

> 6. 对比官方GZIP解压缩代码,检查你的解压缩代码是否存在bug。

> 7. 将原压缩文件解压后再重新压缩,看是否仍然报该错。来排查是否是文件本身的问题。 除此之外,还可以尝试使用其他GZIP库来解压,或者直接用 unzip命令,看是否仍然报同样的错误。这可以排除代码方面的问题。

嗯,说了一大堆有用的废话,还是自己打断点吧。

很快啊,我定位到封装了发送http请求的方法中,在其中有一个解析相应数据的方法EntityUtils.toString(response.getEntity(), "utf-8");

因为本人阅读源码的能力不强,在这就不赘述底层逻辑了,总之就是这行报错了,一开始觉得是我请求头的问题,改了又改,无果,通过各种套路GPT得到了以下回答:

>   问:如果响应头中缺少Content-Encoding会导致Not in GZIP format报错吗

>   答:是的。如果响应主体确实使用了gzip编码,但响应头却缺少Content-Encoding字段,这很容易导致Not in GZIP format的错误。 具体的原因是: 由于缺少Content-Encoding字段,客户端不知道响应使用了gzip编码。

> 尝试使用gzip解码器解码主体内容时,会发现内容并非有效的gzip编码格式,就报Not in GZIP format的错误。

> 所以如果响应确实使用了gzip编码,Content-Encoding字段就非常重要:

> - 没有Content-Encoding字段,客户端无法意识到响应使用了gzip编码

> - 尝试使用gzip解码器解码主体内容时,会报Not in GZIP format错误 相反,如果响应主体内容没有使用gzip编码,那么缺少Content-Encoding字段就不会报这个错。

> 所以,为了解决这个问题,关键在于确保:

> 1. 响应主体是否确实使用了gzip编码

> 2. 响应头正确加入Content-Encoding: gzip字段

> 3. 然后使用gzip解码器来解码主体内容 只有响应主体确实使用gzip编码、但响应头又缺少Content-Encoding字段的情况下, 才会导致Not in GZIP format错误。 只有当响应真正不是gzip编码的时候,这个错误才不会出现。

通过它的解答,我开始怀疑是对接方的问题,于是乎,第二天上班找到对面负责人进行礼貌问候,不出五分钟,真的非常快,那边答复:好了

我(已黑化):啊?

白加班了。。。

由于是小公司没什么话语权,对接方还是上游,所以没有仔细问原因,但是我觉得大概率是响应头的问题,如果大家有别的看法可以学术讨论下。

其实这次问题并没有涉及到什么技术问题,只是沟通存在问题,这种情况我在开发时也遇到很多次了,所以写代码的同时也要注意及时沟通,遇到不明白的问题问同事,问对接方,自己闷着是解决不了问题的,问问问,问到明白为止、问到问题解决为止。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java实现百度云文字识别接口代码

    java实现百度云文字识别接口代码

    这篇文章主要为大家详细介绍了java实现百度云文字识别的接口代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • 使用ElasticSearch6.0快速实现全文搜索功能的示例代码

    使用ElasticSearch6.0快速实现全文搜索功能的示例代码

    本篇文章主要介绍了使用ElasticSearch6.0快速实现全文搜索功能,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • Java中使用开源库JSoup解析HTML文件实例

    Java中使用开源库JSoup解析HTML文件实例

    这篇文章主要介绍了Java中使用开源库JSoup解析HTML文件实例,Jsoup是一个开源的Java库,它可以用于处理实际应用中的HTML,比如常见的HTML格式化就可以用它来实现,需要的朋友可以参考下
    2014-09-09
  • 基于spring同名bean覆盖问题的解决

    基于spring同名bean覆盖问题的解决

    这篇文章主要介绍了spring同名bean覆盖问题的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Spring MVC 中获取session的几种方法(小结)

    Spring MVC 中获取session的几种方法(小结)

    这篇文章主要介绍了Spring MVC 中获取session的几种方法(小结),具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • Mybatis批量修改时出现报错问题解决方案

    Mybatis批量修改时出现报错问题解决方案

    这篇文章主要介绍了Mybatis批量修改时出现报错问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Java模拟qq软件的详细过程

    Java模拟qq软件的详细过程

    这篇文章主要为大家详细介绍了用Java实现模拟QQ,实现了消息通信+登陆界面美化,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • SpringBoot如何集成Token

    SpringBoot如何集成Token

    文章介绍了如何使用jjwt插件实现Token的生成和校验,该插件可以直接与SpringBoot集成,Token由三部分组成,分别是header、payload和signature,通过在请求头中传递Token,后端可以验证其合法性,从而提高安全性
    2025-01-01
  • Java 通过AQS实现数据组织

    Java 通过AQS实现数据组织

    这篇文章主要介绍了通过AQS实现数据组织,想了解AQS的同学可以参考下
    2021-04-04
  • SpringBoot中的@ApiModelProperty注解作用

    SpringBoot中的@ApiModelProperty注解作用

    这篇文章主要介绍了SpringBoot中的@ApiModelProperty注解作用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。
    2022-01-01

最新评论