在Java中读取网页IOException早期EOF

我经常在阅读网页时遇到“早熟EOF”exception。

以下是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.(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(); } 

什么是过早的EOFException以及它为什么会在这种特殊情况下发生?如何避免?

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

这可能是因为您逐行读取内容,而最后一行文件可能缺少返回,以指示行尾。 用这个替换你的时间:

 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); } 

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

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

  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.... }