2013-11-27 1 views
0

다음 코드 줄이 많이 있습니다. (본 웹 사이트의 예를 들어.) 특정 문자의 키 입력 또는 ASCII 값, 또는 이스케이프 시퀀스 등을 테스트하기 이제프로그래머가 System.in.read()에서 char을 사용하는 이유가 있습니까?

char ch = (char) System.in.read(); // uses a char, and requires a cast. 

..

if (ch == 'a' || ch == 65 || ch == '\n' || ch == 13) System.out.print("true"); 

위에서 제공 숯불을 사용 하는가 int를 사용하는 아래 코드 행에 대한 이점은 무엇입니까?

int i = System.in.read(); // uses an int, which requires no cast. 

int 변수 "i"는 앞에서 설명한 것과 같은 if 문에서 사용할 수 있습니다.

+1

솔직히 대답은 아마 가독성만큼 간단합니다. 의도는 char로 사용하기 때문에 프로그래머는 char로 변환합니다. – riwalk

답변

2

어느 쪽도 올바른 방법이 아닙니다. System.in에서 문자를 읽는 올바른 방법은 InputStreamReader (또는 올바른 기능을 제공하는 경우 Scanner)을 사용하는 것입니다. 그 이유는 InputStream.read()은 문자가 아닌 단일 바이트를 읽고 일부 문자는 두 개 이상의 바이트를 읽어야하기 때문입니다. 바이트를 문자로 변환 할 때 사용할 문자 인코딩을 지정할 수도 있습니다.

Reader rdr = new InputStreamReader(System.in); 
int i = rdr.next(); 
if (i == -1) { 
    // end of input 
} else { 
    // normal processing; safe to cast i to char if convenient 
} 
+0

샘플 코드의 첫 번째 줄에 대해 'Reader rdr = new InputStreamReader (System.in);' 변수 "rdr"이 InputStreamReader 유형이 아닌 Reader 유형인지 설명해주십시오. 구체적으로, 이것이 제공하는 이점을 설명해주십시오. 고마워. 또한 코드 샘플에서 next() 메서드를 사용할 때 read()를 사용 했습니까? – user2911290

+1

@ user2911290 -이 경우 특별한 이점이 없습니다. 그것은 단지 습관입니다. 좀 더 구체적인 유형의 특정 기능이 필요하지 않으면 보통 인터페이스로 프로그래밍합니다. 미래의 코드 진화를보다 쉽게 ​​만듭니다. (예를 들어, 메소드 나 동작에 의존적 인'InputStreamReader'가 있는지 걱정하지 않고'CharArrayReader' 또는'PipedReader'로 전환 할 수 있습니다.) –

2

캐스팅 할 이유가 전혀 없습니다. 'a'는 INT의 범위 내의 값이기 때문,

int i = System.in.read(); 
if(i == 'a'){ 
    // do something 
} 

당신은이 작업을 수행 할 수 있습니다 괜찮습니다. 무엇 InputStream.read()가 수행하는 것은 byte 아닌 char 읽기 때문에

또한, 파일 등을 읽을 때 문자 에 직접 캐스팅을하는 것은 문제가 될 수도 있다는 점을 유의해야합니다. char은 2 바이트입니다.

관련 문제