问题
I am frequently getting a 'Premature EOF' Exception when reading a web page.
The following is the 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)
Following is the getPage() method
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();
}
What is a permature EOFException and why is it occuring in this particular case and how can it be avoided?
Some other information: The size of the page being read is around 20 KB and I'm reading many such pages in my program ( around 20 000 )
回答1:
This may be because you are reading the content line by line and for the last line the file may be missing a return, to signal the end of line. Replace your while with this:
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);
}
回答2:
This could be because the server is closing the connection. I have experienced the exact same issue when I had a piece of code which opened a connection, did some other processing, and only then tried to download the contents of the input stream - by the time it to the stream after spending a few seconds on other processing, the server had apparently closed the connection, resulting in IOException: Premature EOF. The solution was to be careful to always immediately handle the contents of the stream - otherwise, you are leaving an HTTP connection open and idle, and eventually the server on the other end of the line will hang up on you.
回答3:
You can use APACHE commons io FileUtils.copyURLToFile
method
http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html#copyURLToFile%28java.net.URL,%20java.io.File,%20int,%20int%29
回答4:
You can also try to set the buffer size to 1. This slightly helps and if you implement a try logic around it, then it should do the trick.
回答5:
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....
}
来源:https://stackoverflow.com/questions/13210108/reading-a-web-page-in-java-ioexception-premature-eof