web-dev-qa-db-ja.com

Java IOException Premature EOF

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)。

11
Ranjith

これは、コンテンツを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);
}
8
dan

これは、サーバーが接続を閉じていることが原因である可能性があります。接続を開き、他の処理を行ったコードがあり、入力ストリームのコンテンツをダウンロードしようとしたのはその後だけでしたが、それまでにまったく同じ問題が発生しました。他の処理に数秒を費やした後、サーバーが接続を閉じたようで、IOException:PrematureEOFが発生しました。解決策は、ストリームのコンテンツを常にすぐに処理するように注意することでした。そうしないと、HTTP接続を開いたままアイドル状態のままにし、最終的には回線の反対側のサーバーがハングアップします。

4
chackley

バッファサイズを1に設定することもできます。これは少し役立ちます。その周りにtryロジックを実装すると、うまくいくはずです。

0
Ducaz035