文章目录[隐藏]
这其实是非常基础的一篇文章,写作缘由是最近发现自己写的spider爬部分deflate网站乱码。
当你发现URLConnection返回的OutputStream通过Reader读出的是乱码(处理过编码),那么这篇文章非常适合你。
事实上,这些网站为了访问速度,将数据进行了压缩。其实一般的网站是不会如此直接强硬的,在请求的header中若没有Accept-Encoding,就不会返回压缩过的数据。但是部分网站鸟都不鸟……那就需要我们的解压了。
OutputStream out = urlConnection.getOutputStream();
out = new BufferedOutputStream(out); // 缓冲
out = new GZIPOutputStream(out); // 解压数据
因为x-gzip非常常见,所以真的超级简单有木有?!只要一个流就OK了。
其实也是一个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头。
实际上,header里的Content-Encoding展示的就是这段信息的压缩方式。URLConnection提供了getContentEncoding方法来获取,该方法会返回字串符形式的编码信息,如无则会返回null。