首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >[Java]关于Deflate、GZip格式网页的解压

[Java]关于Deflate、GZip格式网页的解压

作者头像
KAAAsS
发布2022-01-13 13:47:16
发布2022-01-13 13:47:16
1.2K0
举报
文章被收录于专栏:KAAAsS's BlogKAAAsS's Blog

文章目录[隐藏]

这其实是非常基础的一篇文章,写作缘由是最近发现自己写的spider爬部分deflate网站乱码。

当你发现URLConnection返回的OutputStream通过Reader读出的是乱码(处理过编码),那么这篇文章非常适合你。

事实上,这些网站为了访问速度,将数据进行了压缩。其实一般的网站是不会如此直接强硬的,在请求的header中若没有Accept-Encoding,就不会返回压缩过的数据。但是部分网站鸟都不鸟……那就需要我们的解压了。

Gzip的解压


代码语言:javascript
复制
OutputStream out = urlConnection.getOutputStream();
out = new BufferedOutputStream(out); // 缓冲
out = new GZIPOutputStream(out);        // 解压数据

因为x-gzip非常常见,所以真的超级简单有木有?!只要一个流就OK了。

Deflate


其实也是一个Stream就解决~

代码语言:javascript
复制
OutputStream out = urlConnection.getOutputStream();
out = new BufferedOutputStream(out); // 缓冲
out = new InflaterOutputStream(out);        // 解压数据

但是但是,你却发现有些网站解压时报错:

java.util.zip.ZipException: Wrong Header

啥?!头部错误?!实际上是这样子的,deflate的数据应该有个zlib头,但是这个服务器并没有提供,自然报错。解决方法是:

代码语言:javascript
复制
out = new InflaterOutputStream(out, new Inflater(true)); // 忽略Zlib头

没错,在构造函数的nowarp传入true即可忽视zlib头。

获取Encoding信息


实际上,header里的Content-Encoding展示的就是这段信息的压缩方式。URLConnection提供了getContentEncoding方法来获取,该方法会返回字串符形式的编码信息,如无则会返回null。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016/03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Gzip的解压
  • Deflate
  • 获取Encoding信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档