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

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

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

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

Gzip的解压


OutputStream out = urlConnection.getOutputStream();
out = new BufferedOutputStream(out); // 缓冲
out = new GZIPOutputStream(out);        // 解压数据

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

Deflate


其实也是一个Stream就解决~

OutputStream out = urlConnection.getOutputStream();
out = new BufferedOutputStream(out); // 缓冲
out = new InflaterOutputStream(out);        // 解压数据

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

java.util.zip.ZipException: Wrong Header

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

out = new InflaterOutputStream(out, new Inflater(true)); // 忽略Zlib头

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

获取Encoding信息


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

分享到

KAAAsS

喜欢二次元的程序员,喜欢发发教程,或者偶尔开坑。(←然而并不打算填)

相关日志

  1. 没有图片
  2. 没有图片
  3. 没有图片
  4. 没有图片
  5. 没有图片
  6. 没有图片

评论

还没有评论。

在此评论中不能使用 HTML 标签。