2013-09-26 3 views
0

예를 들어 다음과 같은 기본 프로그램을 가지고 : 그것은 완벽하게 잘 작동사용자로부터 입력을받는 여러 가지 방법의 차이점은 무엇입니까?

import java.util.Scanner; 

public class Practice 
{ 
    public static void main(String[] args) 
    { 
     char userInput; 
     String convertString; 

     do 
     { 
      System.out.println("Here are your choices:"); 
      System.out.println("A. \nB. \nC. \nD."); 

      Scanner kbd = new Scanner(System.in); 
      convertString = kbd.next(); 
      userInput = convertString.charAt(0); 

      switch(userInput) 
      { 
      case 'A': 
       System.out.println("You have chosen A!"); 
       break; 
      case 'B': 
       System.out.println("You have chosen B!"); 
       break; 
      case 'C': 
       System.out.println("You have chosen C!"); 
       break; 
      case 'D': 
       System.out.println("You have chosen D! This program will now terminate."); 
       break; 
      default: 
       System.out.println("Sorry, you have to make a selection."); 
      } 
     } while (userInput > 'D'); 

    } 
} 

. 그러나 스캐너 버전을 사용하는 경우 System.in.read() 버전을 사용하면 내 프로그램에서 3 번 반복되어 선택을 허용합니다. 왜 이런 일이 발생하며 어떻게 해결할 수 있습니까?

나는 C/C++ 배경에서 왔기 때문에 입력 스트림에 문자 '\ n'이 남아 있기 때문에 '입력란에 남았습니다.'그리고 프로그램이 원하는 입력을 허용하지 않고 루프를 돌릴 때, 그것은 스트림을 지우고 있습니다. 그러나 이것이 사실이라면 왜 한번 반복하지 않고 3 번 반복하는 것입니까? (\ n 입력 스트림에서 나머지 왼쪽 문자 만 가져와야하기 때문에).

그리고 마지막으로 어떤 방법이 가장 일반적으로 사용됩니까?

감사합니다.

+2

System.in 기반의 방법은 감가 상각, 그것을 사용하지 않는, 그것은 나쁜, 그들은 나쁜 것을 깨달았다, 그들은 우리가 행복 –

+4

System.in.read()는 입력으로부터 단일 바이트를 읽고 있었다, 우리에게 스캐너를 준 흐름. InputStreamReader에서 랩핑하고 전체 라인을 읽으십시오. – Cruncher

+2

@RichardTingle :'System.in'은 더 이상 사용되지 않으며, 나쁘지도 않습니다. 단지이 작업에 적합한 도구가 아닙니다. 그들은 올바른 도구가 빠져 있다는 것을 깨달았습니다. 그래서 스캐너가 추가되었습니다. – Thomas

답변

0

Windows에서 System.in.read()을 사용할 때 프로그램이 세 번 반복됩니다. Windows에서 줄 분리 기호는 줄 바꿈 뒤에 줄 바꿈 또는 "\r\n" 두 줄의 문자가 있기 때문입니다.

Unix 시스템 (Mac OS X, Linux, Solaris 등)에서 줄 분리 기호는 단일 줄 바꿈 \n입니다.

당신은 전체 라인을 BufferedReaderSystem.in을 포장하고 읽고이 문제를 극복하거나, 더 나은 Scanner 또는 Console 클래스를 사용하거나, 어떤 사람에 따라 무엇보다도, 그래픽 사용자 인터페이스를 사용할 수 있습니다.

이전 방법을 사용하는 예 :

BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
String line = in.readLine(); 

Console 클래스에 사용하는 예 :

Console con = System.console(); 
String line = con.readLine(); 
+0

InputStreamReader를 사용하는 것이 좋습니다. 데이터는 자바 프로그램에 보내기 전에 콘솔에 의해 버퍼 됨 – Cruncher

+0

'InputStreamReader' 클래스는'readLine' 메소드를 가지고 있지 않지만 BufferedReader를 생성하기위한 중간 단계로 필요합니다. – Joni

+0

어떤 이유로 InputStreamReader가 행을 읽을 수 있다고 생각했습니다. 오 잘 – Cruncher

0

System.inInputStream하다에 매우 낮은 레벨의 스트림 클래스 가깝다 C++의 경우 std::streambuf이거나 C의 경우 fread입니다. 단일 바이트 및 고정 크기 바이트 배열을 읽을 수 있습니다. 유용한 정보를 얻으려면 BufferedReader에 포장하고 readLine() 메소드를 제공해야합니다.

관련 문제