2016-12-08 4 views
0

Javaの入力について少し問題があります。 私のコードは推測の文字ゲームです(私は本からそれを読んでいます)。 私のコードです。Javaでバッファされた行は何ですか?

public class Guess4 { 
    public static void main(String args[]) 
    throws java.io.IOException{ 
     char ch, ignore, answer = 'K'; 

     do{ 
      System.out.println("I'm thinking of a letter between A and Z."); 
      System.out.print("Can you guess it : "); 

      ch = (char) System.in.read(); 

      do{ 
       ignore = (char) System.in.read(); 
      }while(ignore != '\n'); 

      if(ch == answer) System.out.println("** Right **"); 
      else{ 
       System.out.print("...Sorry, you're "); 
       if(ch<answer) System.out.println("too low."); 
       else System.out.println("too high."); 
       System.out.println("Try again!\n"); 
      } 
     }while(answer != ch); 
    } 

このコードブロックが必要な理由はわかりません。

do{ 
    ignore = (char) System.in.read(); 
}while(ignore != '\n'); 

このブロックが削除されたとき。出力は異なって出ました。

この本はバッファローされた行について何か言ったが、私はまだ理解していない。 バッファリングされた行は誰でも説明できますか?

ありがとうございます。

+0

'ignore'変数はまったく必要ありません。 'while(System.in.read()!= '\ n')'を使用することができます。 – Bubletan

+0

@Bubletanあなたは技術的に正しいですが、変数名は何が起こっているかのヒントを与えます。もちろんこれはコメントで表現することもできます。 – Henry

+0

@Henry私は、コメントが間違いなくスコープの外のどこかで宣言された変数のよりよい選択肢だと言います。 – Bubletan

答えて

2

プログラムは、ユーザーに1文字を入力するよう要求しています。しかし、System.inはバッファされています。ユーザーは実際に複数の文字を入力できます。長い文章。最終的に彼は文字「\ n」であるEnterを押す。

プログラムがCHに文字を読み取ります

ch = (char) System.in.read(); 

そして、それがさらに進んで、それは '\ n' の文字が見つかるまで読み続ける:あなたがしないと

do { 
     ignore = (char) System.in.read(); 
    } while (ignore != '\n'); 

をこのステップでは、ユーザが入力した余分な入力は、外側ループの次の反復のために持ち越されます。あなたは何かを持ち越す必要はありません。最初の文字だけを入力し、残りの文字は破棄して、次の反復ではきれいなバッファで開始します。

ループを無視してコードをコメントアウトしてみてください。 1つの文字を入力すると、入力した文字と入力を終了した '\ n'文字の外側ループが2回実行されます。複数の文字を入力する場合は、「hello」としましょう。ループは、h-e-l-l-oの場合は6回、h-e-l-l-oの場合は5回、入力を終了する場合はもう一度 '\ n'

- >入力バッファをクリアするには、ignoreを指定したループが必要です。だから、3回目の試みで、それは成功を印刷し

A 
J 
K 

:私は次のコードの入力のようなものになるだろうと仮定したコードから判断

0

コンソールからテキストを入力すると、入力は通常「Enter」または「Return」を押すとプログラムに送信されます。プログラムは、あなたが興味を持っている1文字だけでなく、改行文字(改行文字\nを含む)を取得します。

whileループは余分な文字を扱い、それらを投げ捨てます。

0

Enterキーを押すと次の文字が表示されます。 文字を入力する場合は(Aと言う)、System.inから得られる文字はA\n(2文字)になります。

入力バッファから\nが削除され、プログラムのロジックが混乱することはありません。

新しい本はScannerクラスを使用する傾向があります。これはSystem.inからの読み込みよりも簡単です。時代遅れの本を読んでいくと面白いアイディアが生まれるかもしれないので、他の読書資料を検討したいかもしれません。

0

。 しかし、(システムが表すように)入力ストリームを見ると、それはA\nJ\nK\nのように見えます。コードが入力ストリームを調べて有効な入力を見つけ、最初の文字の後にあるすべての文字を\n文字が迷惑メールとみなす、つまり無視します。

入力ストリームがAK\nKA\nのようなものであれば、1文字目の入力後のすべての文字を無視するので、2番目の行では成功しません。つまり、最初の行はA、2行目はKです。

あなたが言及したブロックを削除すると、あなたのコードはKと明らかに一致しない\nを含む入力ストリームのすべての文字を読み込みます。

バッファリングされた入力ストリームが入力を処理して、余分な迷惑メールを削除して、入力を読み取るだけです。例: これはSystem.inストリームをReaderオブジェクトに渡し、BufferedReaderはすべての魔法を実行します。もう少し深くなると、これらのクラスにははるかに多くのことがあります。