10

URL (一部の Apache サーバー上のファイル) で InputStreamReader を介してBufferedReaderを使用して、Web ドキュメントからテキストを読み取ろうとしています。

String result = "";
URL url = new URL("http://someserver.domain/somefile");
BufferedReader in = null;
in = new BufferedReader(new InputStreamReader(url.openStream(), "iso-8859-1"));

result += in.readLine();

これで問題なく動作します。しかし明らかに、読者には 1 行だけではなく、ファイル内にある行をすべて読んでもらいたいと思います。
BufferedReader API を見ると、次のコードがまさにそれを行うはずです。

while (in.ready()) {
    result += in.readLine();
}

つまり、行が残っている間はすべての行を読み取り、行がなくなったら停止します。ただし、このコードは機能しません。リーダーはready() = trueを報告しません。

行を読み取る (ファイルから正しい文字列を読み取る) 直前に ready() 値を出力することもできますが、リーダーは ' false ' を報告します。

私は何か間違ったことをしていますか?実際に読み取るものがあるのに、BufferedReader が準備完了時に' false ' を返すのはなぜですか?

4

7 に答える 7

11

ready() != にはもっとあります

ready()読み取るデータがまだあることを示しているわけではありません。読み取りスレッドをブロックする可能性があるかどうかのみを示します。すべてのデータを読み取る前に false が返される可能性があります。

これ以上データがないかどうかを確認するには、 if をreadLine()返しますnull

String line = in.readLine();
while(line != null){
   ...
   line = in.readLine();
}
于 2011-01-21T15:16:00.003 に答える
8

をバイパスしてこれを行う別の方法は、次のin.ready()ようなものです。

while ((nextLine = in.readLine()) != null) {
  result += nextLine;
}

読み終わるまで読み続けます。このようにして、 の問題について心配する必要はありませんin.ready()

于 2011-01-21T14:47:36.000 に答える
4

これを記述する標準的な方法は、行を読み取って、いつか返されることを確認することだと思います。このようなもの:

while ((String nextLine = in.readLine()) != null) {
    //System.out.println(nextLine);
    result += nextLine;
}

したがって、ストリームから null が返されるまで続行します。追加情報については、こちらを参照してください。

http://download.oracle.com/javase/1.5.0/docs/api/java/io/BufferedReader.html#readLine()

于 2011-01-21T14:47:45.063 に答える
1

BufferedReader.ready()メソッドは指定どおりに動作しています。

Reader.ready()javadocには次のように書かれています。

[戻り値] truenextread()が入力に対してブロックしないことが保証されている場合、falseそうでない場合。返さfalseれても、次の読み取りがブロックされることは保証されないことに注意してください。

次に、BufferedReader.ready()javadocには次のように記載されています。

このストリームを読み取る準備ができているかどうかを示します。バッファーが空でない場合、または基になる文字ストリームが準備完了の場合、バッファーされた文字ストリームは準備完了です。

この2つを組み合わせると、キャラクターが利用可能な状況で戻ることBufferedReader.ready() ができることは明らかです. false要するに、ready()論理的なファイルの終わりまたはストリームの終わりをテストするために依存するべきではありません。

于 2011-01-21T15:06:12.210 に答える
0

これは、私たちが何年もの間一貫して使用してきた方法です。これが「標準」の方法かどうかはわかりません。URL.openURLStream() を直接使用することの長所と短所、およびそれが OP の問題を引き起こしているかどうかについてのコメントを聞きたいです。このコードは、HTTP 接続と HTTPS 接続の両方で機能します。

 URL  getURL = new URL (servletURL.toString() + identifier+"?"+key+"="+value);      
 URLConnection uConn = getURL.openConnection();

 BufferedReader br = new BufferedReader (new
                            InputStreamReader (uConn.getInputStream()));
 for (String s = br.readLine() ; s != null ; s = br.readLine()) {
      System.out.println ("[ServletOut] " + s);
      // do stuff with s
 }               
 br.close();
于 2011-01-21T15:17:18.137 に答える
0

基本的に、BufferedReader.ready() メソッドは、基になるストリームがメソッドの呼び出し元にデータを提供する準備ができているかどうかを確認するために使用できます。それ以外の場合は、準備が整うまでスレッドをしばらく待つことができます。

しかし、本当の問題は、データ ストリームを完全に読み取った後、false がスローされることです。そのため、ストリームが完全に読み取られているか、基になるストリームがビジーであるかがわかりませんでした....

于 2011-07-19T12:44:34.280 に答える
0

in.ready() を使用する場合は、次のようにするとうまくいきました。

    for (int i = 0; i < 10; i++) {
        System.out.println("is InputStreamReader ready: " + in.ready());
        if (!in.ready()) {
            Thread.sleep(1000);
        } else {
            break;
        }
    }
于 2017-01-26T11:40:01.600 に答える