왜 첫 번째 루프 이후 스위치가 입력을 기다리기 전에 두 번 실행됩니까? 표준 입력에 남은 문자가 있습니까? 문제를 어떻게 해결할 수 있습니까?system.in.read miss execution
while(true)
{
int choice = System.in.read();
switch(choice)
{
case '1':
break;
default:
break;
}
}
왜 첫 번째 루프 이후 스위치가 입력을 기다리기 전에 두 번 실행됩니까? 표준 입력에 남은 문자가 있습니까? 문제를 어떻게 해결할 수 있습니까?system.in.read miss execution
while(true)
{
int choice = System.in.read();
switch(choice)
{
case '1':
break;
default:
break;
}
}
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());
나는 리눅스에 있는데, System.in.read가 리눅스에서 LF를 소비한다는 것을 의미합니까? – ethan
네, 사실,'System.getProperty ("line.separator")' – Reimeus
고마워! 나는 아직도 혼란스럽지 않다.나는 문서가 inputstream.read (system.in.read)가 바이트를 읽는 반면 inputStreamReader.read는 문자를 읽는다고 보았다. 그래서 리눅스에서 그 의미는 문자 1 바이트로 표현에? 하지만 내가 숯을 입력하면 'a/n'으로 구성됩니까? sizeof와 같은 java 함수를 사용하면 실제 내용을 볼 수 있습니다. – ethan
이것은 Infinite Loop
입니다. 그것은 단지 입력을 계속할 것입니다.
이 같은 System.in.read()
보다, 귀하의 의견을 얻을 수있는 Scanner
를 사용한다 : -
Scanner s = new Scanner(System.in);
while(true)
{
int choice = s.nextInt();
if(choice == 1){
break;
}
}
s.close();
AutoCloseable이고 첫 번째 반복 이후에 입력 스트림을 닫으므로 루프 내에 스캐너를 작성하지 않아야합니다. –
@Andreas - 답변이 업데이트되었습니다. 제안 주셔서 감사합니다! – SudoRahul
합니다. 데이터를 입력 한 후에 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.
}
이 경우 레이블이 문에 브레이크를 사용할 수 있습니다. 자세한 내용은 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;
}
}
}
}
}
, 아마 10, 13
이 때문에 스위치가 두 번 실행됩니다.
Reimeus가 입력 한 더 좋은 방법은 Chris Cooney입니다.
조사를하고 실제로받은 문자를 인쇄하지 않는 이유는 무엇입니까? 내 생각 엔 당신이 윈도우 시스템에서'0x0D'와'0x0A' 두 글자 인 enter를 치는 것입니다. –