解决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编码的时候,这个错误才不会出现。

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

我(已黑化):啊?

白加班了。。。

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

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

总结

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

相关文章

  • SpringBoot中的Thymeleaf用法

    SpringBoot中的Thymeleaf用法

    Thymeleaf是最近SpringBoot推荐支持的模板框架。本文重点给大家介绍SpringBoot中的Thymeleaf用法,需要的的朋友参考下吧
    2017-05-05
  • Spring boot Rabbitmq消息防丢失实践

    Spring boot Rabbitmq消息防丢失实践

    这篇文章主要介绍了Spring boot Rabbitmq消息防丢失实践,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • Java生成Echarts表图的2种实现方案

    Java生成Echarts表图的2种实现方案

    这篇文章主要给大家介绍了关于Java生成Echarts表图的2种实现方案,ECharts是一款功能非常强大的JavaScript图表库,文中通过代码实例介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • 基于SpringBoot和Vue实现分片上传系统

    基于SpringBoot和Vue实现分片上传系统

    最近想做一个关于文件上传的个人小网盘,一开始尝试使用了OSS的方案,但是该方案对于大文件来说并不友好,所以开始尝试分片上传方案的探索,接下来小编给大家详细的介绍一下如何基于SpringBoot和Vue实现分片上传系统,需要的朋友可以参考下
    2023-12-12
  • SpringBoot中自定义注解实现控制器访问次数限制实例

    SpringBoot中自定义注解实现控制器访问次数限制实例

    本篇文章主要介绍了SpringBoot中自定义注解实现控制器访问次数限制实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-04-04
  • SpringCloudConfig之client端报错Could not resolve placeholder问题

    SpringCloudConfig之client端报错Could not resolve placeholder问

    这篇文章主要介绍了SpringCloudConfig之client端报错Could not resolve placeholder ‘from‘ in value “${from}“问题及解决方案,具有很好的参考价值,希望对大家有所帮助
    2022-12-12
  • 浅谈JAVA实现选择排序,插入排序,冒泡排序,以及两个有序数组的合并

    浅谈JAVA实现选择排序,插入排序,冒泡排序,以及两个有序数组的合并

    这篇文章主要介绍了JAVA实现选择排序,插入排序,冒泡排序,以及两个有序数组的合并,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • 详解SpringBoot中的统一异常处理

    详解SpringBoot中的统一异常处理

    这篇文章主要介绍了详解SpringBoot中的统一异常处理,在独立的某个地方,比如单独一个类,定义一套对各种异常的处理机制,需要的朋友可以参考下
    2023-05-05
  • Java多线程中Lock的使用小结

    Java多线程中Lock的使用小结

    jdk1.5 以后,提供了各种锁,本文主要介绍了Java多线程中Lock的使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 序列化版本号serialVersionUID的作用_动力节点Java学院整理

    序列化版本号serialVersionUID的作用_动力节点Java学院整理

    Java序列化是将一个对象编码成一个字节流,反序列化将字节流编码转换成一个对象,这篇文章主要介绍了序列化版本号serialVersionUID的作用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05

最新评论