在阅读网页时,我经常会收到“过早的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();
}
什么是过早的EOFException,为什么在这种特殊情况下会发生?如何避免?
其他一些信息:正在阅读的页面大小约为20 KB,我在我的程序中阅读了很多这样的页面(大约20 000)
答案 0 :(得分:7)
这可能是因为您逐行读取内容,而最后一行文件可能缺少返回,以表示行尾。用这个替换你的时间:
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);
}
答案 1 :(得分:3)
这可能是因为服务器正在关闭连接。当我有一段代码打开一个连接,做了一些其他处理,只有然后试图下载输入流的内容时 - 我遇到了相同的问题在其他处理上花了几秒后,服务器显然关闭了连接,导致IOException:过早的EOF。解决方案是要小心,始终立即处理流的内容 - 否则,您将保持HTTP连接打开和空闲,最终线路另一端的服务器将挂断您。
答案 2 :(得分:0)
您可以使用APACHE commons io FileUtils.copyURLToFile
方法
答案 3 :(得分:0)
你也可以尝试将缓冲区大小设置为1.这有点帮助,如果你围绕它实现try逻辑,那么它应该可以解决问题。
答案 4 :(得分: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....
}