簡體   English   中英

java.io.IOException:讀取Transfer-Encoding時過早的EOF:分塊的HTTP響應

[英]java.io.IOException: Premature EOF when reading Transfer-Encoding: chunked http response

我編寫了一個小的命令行程序來讀取網頁並將響應正文打印到終端。

這對於大多數站點都適用,但是從以下URL讀取分塊響應時: http : //www.pampers.co.uk/home,我得到以下追溯信息:

java.io.IOException: Premature EOF
at sun.net.www.http.ChunkedInputStream.readAheadBlocking(ChunkedInputStream.java:538)
at sun.net.www.http.ChunkedInputStream.readAhead(ChunkedInputStream.java:582)
at sun.net.www.http.ChunkedInputStream.read(ChunkedInputStream.java:669)
at java.io.FilterInputStream.read(FilterInputStream.java:116)
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:2668)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.Reader.read(Reader.java:123)
at HttpPageReader.main(HttpPageReader.java:44)`

我已經對字符集進行了硬編碼,以匹配此頁面上的響應。 我應該采取什么步驟來調試此問題? 我以為這不是Java錯誤,而是Web服務器返回的內容有問題-但是,我已經在Web瀏覽器中查看了該頁面,並使用curl進行了下載,但都沒有問題。

代碼如下,應易於復制和粘貼並獨立運行:

import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.logging.Logger;

public class HttpPageReader
{    
private final static Logger logger = Logger.getLogger(HttpPageReader.class.getName());

private static final int SECOND_IN_MILLI_SECONDS = 1000;
private static final int TIME_OUT_MILLI_SECONDS  = 10 * SECOND_IN_MILLI_SECONDS;

public static void main(String[] args)
{
    if ( args.length != 1)
    {
        logger.warning("Please provide a url to download");
        System.exit(1);
    }
    logger.info("Downloading url " + args[0] + "...");

    try
    {
        URL url = new URL(args[0]);

        HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
        httpConn.setUseCaches(false);
        httpConn.setRequestProperty("User-Agent", "My User Agent");
        httpConn.setRequestProperty("Accept", "*/*");
        httpConn.setConnectTimeout(TIME_OUT_MILLI_SECONDS);
        httpConn.setReadTimeout(TIME_OUT_MILLI_SECONDS);

        InputStreamReader inputStreamReader = new InputStreamReader(httpConn.getInputStream(), "utf-8");                        
        char chars[] = new char[1000];
        int numRead = inputStreamReader.read(chars);
        StringBuffer stringBuffer = new StringBuffer();
        while (numRead != -1)
        {
            stringBuffer.append(new String(chars, 0, numRead));
            numRead = inputStreamReader.read(chars);
        }

        logger.info("done");            
        logger.info(stringBuffer.toString());

    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

}   
}

更新:按照建議使用IOUtils.toString(httpConn.getInputStream(),“ utf-8”)可以得到幾乎相同的回溯-因此問題仍然存在,我該如何調試此問題?

給出:

java.io.IOException: Premature EOF
at sun.net.www.http.ChunkedInputStream.readAheadBlocking(ChunkedInputStream.java:538)
at sun.net.www.http.ChunkedInputStream.readAhead(ChunkedInputStream.java:582)
at sun.net.www.http.ChunkedInputStream.read(ChunkedInputStream.java:669)
at java.io.FilterInputStream.read(FilterInputStream.java:116)
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:2668)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.Reader.read(Reader.java:123)
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1928)
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1907)
at org.apache.commons.io.IOUtils.copy(IOUtils.java:1884)
at org.apache.commons.io.IOUtils.copy(IOUtils.java:1834)
at org.apache.commons.io.IOUtils.toString(IOUtils.java:705)
at org.apache.commons.io.IOUtils.toString(IOUtils.java:730)
at HttpPageReader.main(HttpPageReader.java:40)

試試這個.....這樣更容易...記住不要在程序中重載n nos,直到您真正需要它們為止。

只要復制粘貼此代碼,然后嘗試...然后嘗試以自己的方式對其進行修改即可。...祝您好運!

package com.my;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Scanner;

public class TestSrc {
    public static void main(String[] args) {
        try {
            URL url = new URL("http://www.pampers.co.uk/home");
            try {
                InputStream i = url.openStream();
                Scanner scan = new Scanner(i);

                while (scan.hasNextLine()) {
                    System.out.println(scan.nextLine());
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }
}

您是否嘗試過使用IOUtils.toString(inputStream)

Apache Commons IOUtils

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM