Webページを読んでいるときに、「早期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で、プログラムでそのようなページをたくさん読んでいます(約20000)。
これは、コンテンツを1行ずつ読み取っていて、最後の行でファイルに戻り値がないために、行の終わりを示している可能性があります。あなたの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);
}
これは、サーバーが接続を閉じていることが原因である可能性があります。接続を開き、他の処理を行ったコードがあり、入力ストリームのコンテンツをダウンロードしようとしたのはその後だけでしたが、それまでにまったく同じ問題が発生しました。他の処理に数秒を費やした後、サーバーが接続を閉じたようで、IOException:PrematureEOFが発生しました。解決策は、ストリームのコンテンツを常にすぐに処理するように注意することでした。そうしないと、HTTP接続を開いたままアイドル状態のままにし、最終的には回線の反対側のサーバーがハングアップします。
バッファサイズを1に設定することもできます。これは少し役立ちます。その周りにtryロジックを実装すると、うまくいくはずです。
Apacheを使用できますcommons io FileUtils.copyURLToFile
方法