0

ObjectInputStream.available()のjavadocにあるように:

ブロックせずに読み取ることができるバイト数を返します。

次のコードを次のように使用できるはずですScanner.hasNext()

if (inputStream.available() > 0) {
    Object input = inputStream.readObject();
}

しかし、ストリームに未読データがあっても使用すると、この状態になりませんtrue

実際、クライアントサーバーアプリケーションでこのように使用していますが、次の場所でスタックしますif:

    while (continueListening) {
        Object responseObj;
        try {
            if (inputStream.available() == 0) { // this condition is always met
                continue;
            }
            responseObj = inputStream.readObject();
            .
            .
            .
4

1 に答える 1

1

InputStreamJavaDocから:

この入力ストリームのメソッドの次の呼び出しによってブロックされることなく、この入力ストリームから読み取る (またはスキップする) ことができる推定バイト数を返します。[...]

クラス InputStream の available メソッドは、常に 0 を返します。

したがって、一般的に、あなたが行ったように の結果に依存することはavailable()お勧めできません。の場合はループし0ており、データのビジー待機を行っています。むしろ、専用スレッドを使用して、readObject()十分なデータが利用可能になるか、例外がスローされるまでブロックするだけの呼び出しを行う必要があります。たとえば、読み取り中に接続が閉じられた場合などです。

Scanner.hasNext()次のトークンが (完全に) 読み取られていない場合、同様にブロックされる可能性があります。

于 2013-07-09T18:10:55.487 に答える