8

我请求一个发送Content-Encoding: gzip标头的网页,但被卡住了如何阅读它..

我的代码:

    try {
        URLConnection connection = new URL("http://jquery.org").openConnection();                        
        String html = "";
        BufferedReader in = null;
        connection.setReadTimeout(10000);
    in = new BufferedReader(new InputStreamReader(connection.getInputStream()));            
    String inputLine;
    while ((inputLine = in.readLine()) != null){
    html+=inputLine+"\n";
        }
    in.close();
        System.out.println(html);
        System.exit(0);
    } catch (IOException ex) {
        Logger.getLogger(Crawler.class.getName()).log(Level.SEVERE, null, ex);
    }

输出看起来很乱..(我无法在这里粘贴它,一种符号..)

我相信这是一个压缩的内容,如何解析它?

注意:
如果我将 jquery.org 更改为 jquery.com(不发送该标头,我的代码运行良好)

4

3 回答 3

16

实际上,这是 pb2q 的答案,但我将完整代码发布给未来的读者

try {
    URLConnection connection = new URL("http://jquery.org").openConnection();                        
    String html = "";
    BufferedReader in = null;
    connection.setReadTimeout(10000);
    //The changed part
    if (connection.getHeaderField("Content-Encoding")!=null && connection.getHeaderField("Content-Encoding").equals("gzip")){
        in = new BufferedReader(new InputStreamReader(new GZIPInputStream(connection.getInputStream())));            
    } else {
        in = new BufferedReader(new InputStreamReader(connection.getInputStream()));            
    }     
    //End        
    String inputLine;
    while ((inputLine = in.readLine()) != null){
    html+=inputLine+"\n";
    }
in.close();
    System.out.println(html);
    System.exit(0);
} catch (IOException ex) {
    Logger.getLogger(Crawler.class.getName()).log(Level.SEVERE, null, ex);
}
于 2012-06-19T01:23:40.097 回答
5

为此有一个类:GZIPInputStream。它InputStream使用起来非常透明。

于 2012-06-19T01:13:04.080 回答
0

Content-Encoding:gzip 标头有两种情况

  1. 如果数据已经压缩(通过应用程序),Content-Encoding:gizp 标头将导致数据再次压缩。所以它的双重压缩。这是因为http 压缩

  2. 如果应用程序未压缩数据,Content-Encoding:gizp 将导致数据压缩(主要是 gzip),并且在到达客户端之前会自动解压缩(un-zip)。解压缩是大多数 Web 浏览器中的默认功能。如果浏览器在响应中找到 Content-Encoding:gizp 标头,它将解压缩。

于 2015-12-24T00:11:52.797 回答