2013-03-19 4 views
5

BufferedReader.readLine()がハングしないようにする方法はありますか?クライアントは、任意の入力を提供してきました場合BufferedReader.readLine()がハングしないようにするにはどうすればよいですか?

  • チェック:

    私は、サーバーを作成しています。

  • そうでない場合は、他のコードを実行し、最終的にクライアントに入力をチェックするようにループバックします。

readLine()を実行せずにクライアントが入力を配信したかどうかを確認するにはどうすればよいですか? readLine()を実行すると、スレッドは入力が配信されるまでハングしますか?

+2

なぜですか?ブロッキングI/Oを使用している場合は、サーバーごとにクライアントごとに個別の読み取りスレッドが必要です。 – EJP

+0

ユーザーごとに2つのスレッドを作成する必要はありません。私はすでに各ユーザーに対して1つのスレッドを持っています。 – Cin316

+1

これはJavaのI/Oライブラリの不幸な現実です。 1)読み取り用に別のスレッドをスピンアップ 2)NIOライブラリを使用する 3)readLine()を使用せず、独自のバッファリングと行末管理を自分で実行してください – creechy

答えて

8

あなたはこのように、BufferedReader.ready()を使用することができます。入力のソースが読まれていないストリームの中には何も入れていない場合

BufferedReader b = new BufferedReader(); //Initialize your BufferedReader in the way you have been doing before, not like this. 

if(b.ready()){ 
    String input = b.readLine(); 
} 

ready()trueを返します。

編集:ちょうどメモ、準備が復活しますtrue文字が1つだけ存在します。 read()を使用して、改行または改行があるかどうかを確認できます。改行または改行がある場合は、改行があることを示します。

詳細:http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#ready()

+7

これは、 'read()'の次の呼び出しはブロックされません。リンクは 'readLine()'について何も言いません。 – Keppil

+2

準備が整っていても、少なくとも1バイトあり、必ずしも全ラインである必要はありません。これはすべての場合に必ずしも機能するとは限りませんが、あなたが運が良ければ、それはあなたがやっていることのためにうまくいくでしょう。 – TofuBeer

関連する問題