2015-11-11 22 views
8

私はJAVAを学習していて、以下のDOをタイプしています。 「q」と入力するとプログラムは終了します。それは実行されますが、なぜ私は3つの行を取得してください "Enterキーの後にキーを押してください:"?非常に単純なjava do ... whileループ

class DWDemo { 
    public static void main (String args[]) 
     throws java.io.IOException { 
      char ch; 
      do { 
       System.out.println("Please a key followed by ENTER:"); 
       ch = (char) System.in.read(); 
      } while (ch != 'q'); 
     } 
} 

enter image description here

答えて

10

あなたがaを入力してEnterを打ったときなので、その後、in.read()方法は3つの文字を返します。 (\r\nの組み合わせは、Windowsでは改行と見なされます)。

プログラムを実行しているOSに固有の改行文字があるため、LinuxまたはOSX上で実行すると、プログラムの動作が大きく異なる可能性があります。 Linuxでは、\n、OS X-9では\rなどとなります。回避策として

、あなたは改行文字(OSの種類を無視)を省略なる、(Scannerを使用して)行全体を読んで、それをトリミングすることができます入力すると

public static void main (String args[]) throws java.io.IOException { 
     String line; 
     Scanner sc = new Scanner(System.in); 
     do { 
      System.out.println("Please a key followed by ENTER:"); 
      line = sc.readLine().trim(); 
     } while (!"q".equals(line)); 
    } 
5

私はあなたのENTERキーの押下を含むされているものの入力として読み込まれますと仮定します。あなたはWindows上にいるので、これにはCRFL行の終了が含まれます。

したがって、charを入力するたびに、実際には3文字が入力されます。あなたの最初の入力の場合:

  1. CR
  2. LF

はBufferedReaderを介したフルラインを読んで試してみて、その上でトリム空白を実行するか、または単にその最初の文字を評価します。 'a'、キャリッジリターン\rの文字と改行の文字('\n') -

3

をWindowsシステムのコマンド行で入力すると、すべての行は、文字である\r\nで終わる改行で終了します。したがって、最初にaと入力すると、実際にはa\r\nと入力されます。

コードSystem.in.read()を実行すると、バッファに入力された最初の文字(この場合はa)だけが読み込まれます。その後、ループが実行され、プロンプトが表示され、バッファ上の次の文字の読み取りが試行されます。この場合、\r\nはまだバッファ上にあるので、\rで読み込みます。再度ループし、\nを読み込みます。最後に、バッファーが空になってから3回目のプロンプトを表示し、入力を待ちます。

これを避けるには、別の方法を使用してSystem.Inの代わりにコマンドラインから読み込むことをお勧めします。おそらくScannerクラスが適切でしょう。

+0

これは、読み取りが文字を返さないことを除いて、ほぼ正確です。バイトを返します。非ASCII文字を入力すると、おそらくデフォルトのエンコーディングに応じて2つの連続した値が返されます。 –

1

あなたが知っておかなければならないことの1つは、System.in.read()は1バイトの入力しか受け入れないということです。 doc hereを参照してください。したがって、ENTERのキー、\r、および\nをもう一度入力すると、read()でさらに2回キャプチャされ、追加のループ反復とプリントロジックをトリガする文字aを入力すると、すでに1バイトになります。

0

@kasobanは、それらがa、CRおよびLFであると述べています。 3回繰り返していますが、OSによって変わります。だから私はスキャナを使用することをお勧めします。以下のサンプルを見つけることができます

public class DW { 
    public static void main (String args[]) throws java.io.IOException { 
     String s; 
     Scanner scanner = new Scanner(System.in); 
     do { 
      System.out.println("Please a key followed by ENTER:"); 
      s = scanner.nextLine(); 
     } while (!"q".equals(s)); 
     } 
    }