2013-03-08 5 views
0

왜 첫 번째 루프 이후 스위치가 입력을 기다리기 전에 두 번 실행됩니까? 표준 입력에 남은 문자가 있습니까? 문제를 어떻게 해결할 수 있습니까?system.in.read miss execution

while(true) 
{ 
int choice = System.in.read(); 
switch(choice) 
{ 
    case '1': 
     break; 
    default: 
     break; 
} 
} 
+1

조사를하고 실제로받은 문자를 인쇄하지 않는 이유는 무엇입니까? 내 생각 엔 당신이 윈도우 시스템에서'0x0D'와'0x0A' 두 글자 인 enter를 치는 것입니다. –

답변

4

InputStream#read 단 하나의 byte을 읽고 2 개 문자, LF하고있을 것 (개행 문자를 소비하지 않습니다 Windows 플랫폼에서는 CR), 다음 read으로 전달합니다. 이 read이 아니며 블록이 입력을 수신했으며 흐름은 default 사례로 전달됩니다.

당신은 대신 BufferedReader를 사용하여 전체 라인 읽을 수 다음 documentation이 방법은 데이터의 단일 바이트에 걸리는 것을 눈치 챘을 것이다 읽을 시간을내어함으로써

BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
... 
int choice = Integer.parseInt(br.readLine()); 
+0

나는 리눅스에 있는데, System.in.read가 리눅스에서 LF를 소비한다는 것을 의미합니까? – ethan

+1

네, 사실,'System.getProperty ("line.separator")' – Reimeus

+0

고마워! 나는 아직도 혼란스럽지 않다.나는 문서가 inputstream.read (system.in.read)가 바이트를 읽는 반면 inputStreamReader.read는 문자를 읽는다고 보았다. 그래서 리눅스에서 그 의미는 문자 1 바이트로 표현에? 하지만 내가 숯을 입력하면 'a/n'으로 구성됩니까? sizeof와 같은 java 함수를 사용하면 실제 내용을 볼 수 있습니다. – ethan

0

이것은 Infinite Loop입니다. 그것은 단지 입력을 계속할 것입니다.

이 같은 System.in.read()보다, 귀하의 의견을 얻을 수있는 Scanner를 사용한다 : -

Scanner s = new Scanner(System.in); 
while(true) 
    { 
     int choice = s.nextInt(); 
     if(choice == 1){ 
      break; 
     } 
    } 
s.close(); 
+0

AutoCloseable이고 첫 번째 반복 이후에 입력 스트림을 닫으므로 루프 내에 스캐너를 작성하지 않아야합니다. –

+1

@Andreas - 답변이 업데이트되었습니다. 제안 주셔서 감사합니다! – SudoRahul

2

합니다. 데이터를 입력 한 후에 Enter 키를 누르면 System.in 스트림에 다른 바이트가 추가됩니다. 즉, Switch 문에 사용할 데이터가 더 많습니다. 이와 같이 스트림을 읽으려면 Scanner을 사용해야합니다.


Scanner s = new Scanner(System.in); 
    // Create a scanner object that reads the System.in stream. 
    int choice = s.nextInt(); 
    // Accept the next int from the scanner. 
    switch(choice) 
    { 
    // Insert selection logic here. 
    } 
0

이 경우 레이블이 문에 브레이크를 사용할 수 있습니다. 자세한 내용은 http://www.javaspecialists.eu/archive/Issue110.html 다음

이 workign 코드 : 다시 어딘가의 선택을 인쇄 할 경우

import java.io.IOException; 

public class Switch { 

    public static void main(String[] args) throws IOException { 
     exitWhile: { 
      while (true) { 
       System.out.println("type>"); 
       int choice = System.in.read(); 

       switch (choice) { 
       case '1': 
        break; 
       default: 
        System.out.println("Default"); 
        break exitWhile; 
       } 
      } 
     } 

    } 
} 
1

, 아마 10, 13

  • '10'를 얻을 것이다 것은 LF (라인 피드 제어 문자).
  • '13'은 CR (캐리지 리턴 제어 문자)입니다.

이 때문에 스위치가 두 번 실행됩니다.

Reimeus가 입력 한 더 좋은 방법은 Chris Cooney입니다.