2017-02-28 9 views
0

私はクライアント/サーバーゲームを持っており、ユーザーはゲームに入力を交互に与えます。ユーザーのタイプが無視されるべきでないときには、ユーザーが入力したいものがすべて必要です。私は、ユーザーが入力を求められた後に入力したものだけをスキャンしたい。入力用にjava.util.Scannerを使用していますが、プログラムがハングしていない状態でスキャナバッファを "フラッシュ"する方法が見つかりません。私はまた、私が欲しいものをやっている他の入力読書方法の例を見つけることができません。プロンプトの前に入力を無視するように入力バッファをクリアするにはどうすればよいですか?

これは私が試したものです:

Scanner in = new Scanner(System.in); 
    //do game stuff 
    //I don't care about anything typed at this time 
while(in.hasNextLine()){ 
    in.nextLine(); 
} 

System.out.println("Enter your move:"); 
String input = in.nextLine(); 
+0

バッファされていない端末io(ネイティブライブラリを使用)を使用せずに、必要な操作を行う方法はありません。 –

+0

@ElliottFrischうーん、それは宿題のための特定の要件なので、それを行う方法があると仮定しました。おかげで – 3802400

+0

これはマルチスレッドアプリですか?あなたのターンはいつどのように分かりますか? –

答えて

0

Scannerを無効にし、それを再度有効にする方法はありません。ここではいくつかの提案は以下のとおりです。

手動(あなたは何をしてきた(と思う))そうのようなプレイヤーのターンの前にScannerを空にすることができます

while(in.hasNext()) in.next(); 

それとも、あなたはでスキャナーを閉じることができますプレイヤーのターンの終わりとは、(あなたが閉じScannerを再度開くことはできません)次のターンの開始時に新しいものをインスタンス化:あなたがアクセスしようと

//Player's turn 
// 
//End of player's turn... 
in.close(); 

//Beginning of player's turn 
in = new Scanner(System.in); 

これは、しかし、IllegalStateExceptionがスローされますScannerが閉じられた後。これを解決するには、リソースブロックを試してみる(Java 7以降で):

//Overridden close method because you don't want to close System.in 
try (Scanner in = new Scanner(new InputStreamReader(System.in) 
    {public void close() throws IOException {}})) { 
    System.out.println("Enter your move:"); 
    String input = in.nextLine(); 
} 
//End of player's turn 
//Scanner is automatically closed and this code is out of the scanner's scope 

私はこの最後のオプションが最善の策だと思います。 Scannerのスコープを関連するコードに制限し、インスタンス化/終了を自動化します。さらに、(比較的)最近のJava機能を使用しているため、これがあなたの問題に対する必要な答えかもしれません。

+0

あなたの最初の提案は私が最初に試みたものであり、プログラムがハングする原因となりました。あなたがそれを示したtryブロックは、スキャナを初めて使用した後にin.nextLine()を呼び出すときに "java.util.NoSuchElementException:No line found"を返します。 – 3802400

+0

この基本的なコードだけを使って、うまく動作します。その例外が発生している場合は、問題の行をwhile(in.hasNextLine())ブロックで囲みます。異なるスレッドでコードを実行していますか? 'nextLine()'はブロッキング呼び出しであるため、次の行が入力される前に他のコードを読み取ることができるのは驚くべきことです。 – MikaelF

+0

私の悪い、System.inはtry-with-resourcesでうまく動かない。私の答えを更新する瞬間を与えてください。 – MikaelF

関連する問題