11

阅读网页时,我经常收到“过早的 EOF”异常。

以下是 StackTrace

java.io.IOException: Premature EOF
    at sun.net.www.http.ChunkedInputStream.readAheadBlocking(ChunkedInputStream.java:556)
    at sun.net.www.http.ChunkedInputStream.readAhead(ChunkedInputStream.java:600)
    at sun.net.www.http.ChunkedInputStream.read(ChunkedInputStream.java:687)
    at java.io.FilterInputStream.read(FilterInputStream.java:133)
    at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:2968)
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
    at java.io.InputStreamReader.read(InputStreamReader.java:184)
    at java.io.BufferedReader.fill(BufferedReader.java:154)
    at java.io.BufferedReader.readLine(BufferedReader.java:317)
    at java.io.BufferedReader.readLine(BufferedReader.java:382)
    at Utilities.getPage(Utilities.java:24)  while ((line = rd.readLine()) != null) {
    at TalkPage.<init>(TalkPage.java:15)
    at Updater.run(Updater.java:65)

以下是 getPage() 方法

public static String getPage(String urlString) throws Exception {
    URL url = new URL(urlString);
    URLConnection conn = url.openConnection();
    BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    StringBuffer sb = new StringBuffer();
    String line;
    while ((line = rd.readLine()) != null) {  // LINE 24
        sb.append(line);
    }
    return sb.toString();
}

什么是 permature EOFException,为什么会在这种特殊情况下发生,如何避免?

其他一些信息:正在读取的页面大小约为 20 KB,我在我的程序中读取了许多这样的页面(大约 20 000)

4

5 回答 5

8

这可能是因为您正在逐行读取内容,并且对于最后一行,文件可能缺少返回,以表示行尾。用这个替换你的while:

int BUFFER_SIZE=1024;
char[] buffer = new char[BUFFER_SIZE]; // or some other size, 
int charsRead = 0;
while ( (charsRead  = rd.read(buffer, 0, BUFFER_SIZE)) != -1) {
  sb.append(buffer, 0, charsRead);
}
于 2012-11-03T14:44:00.607 回答
5

这可能是因为服务器正在关闭连接。当我有一段代码打开连接,进行了一些其他处理,然后才尝试下载输入流的内容时,我遇到了完全相同的问题- 在花费几秒钟后将其下载到流中其他处理,服务器显然已经关闭了连接,导致IOException: Premature EOF。解决方案是要小心始终立即处理流的内容 - 否则,您将打开 HTTP 连接并处于空闲状态,最终线路另一端的服务器将挂断您。

于 2014-05-23T21:00:10.707 回答
0

您可以使用 APACHEcommons io FileUtils.copyURLToFile方法

http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html#copyURLToFile%28java.net.URL,%20java.io.File,%20int,%20int%29

于 2012-11-03T15:14:03.053 回答
0

您也可以尝试将缓冲区大小设置为 1。这有点帮助,如果您围绕它实现一个 try 逻辑,那么它应该可以解决问题。

于 2015-03-06T16:54:54.280 回答
0
        StringBuilder sb = new StringBuilder();

        try{                
            URL url = new URL(address);

            InputStream is = url.openStream();

            InputStreamReader isr = new InputStreamReader(is);

            BufferedReader in = new BufferedReader(isr);

            String str;

            while((str = in.readLine()) != null){

                sb.append(str);

                sb.append("\n");
            }

            in.close();
            isr.close();
            is.close();

            return sb.toString();

         }catch(Exception e){

             //OMG....
         }    
于 2015-03-29T13:53:55.667 回答