2011-03-18 1 views
0

Java 문자 스트림은 바이트 스트림을 랩핑하여 기본 바이트 스트림이 시스템 기본값 또는 달리 특별히 정의 된 문자 세트로 해석된다는 것을 알고 있습니다.왜 문자 스트림입니까?

내 시스템의 기본 문자 집합은 UTF-8입니다.

FileReader을 사용하여 텍스트 파일을 읽는 경우 기본 문자 집합이 기본 InputStreamReader의 바이트를 해석하는 데 사용되므로 모든 것이 정상적으로 보입니다. UTF-8로 인코딩 된 텍스트 파일을 UTF-16으로 읽도록 명시 적으로 InputStreamReader을 정의하면 모든 것이 이상하게 보입니다. FileInputStream과 같은 바이트 스트림을 사용하고 출력을 System.out으로 리디렉션하면 모든 것이 잘 보입니다.

제 질문은;

  • 문자 스트림을 사용하는 것이 유용한 이유는 무엇입니까?

  • 바이트 스트림을 직접 사용하는 대신 문자 스트림을 사용하는 이유는 무엇입니까?

  • 특정 문자 집합을 정의하는 것이 유용한 경우는 언제입니까?

답변

6

문자열을 다루는 코드는 텍스트에 대해서만 "생각"해야합니다. 예를 들어, 입력 소스를 한 줄씩 읽는 경우 해당 소스의 특성을 신경 쓰지 않아도됩니다.

그러나 저장소는 일반적으로 바이트 지향입니다. 따라서 소스의 바이트 지향 뷰 (InputStream으로 캡슐화 됨)와 소스의 문자 지향 뷰 (Reader으로 캡슐화 됨) 사이의 변환을 만들어야합니다.

따라서 입력 소스에서 텍스트 줄을 계산하는 방법은 Reader 매개 변수를 사용해야합니다. 하나의 파일이 UTF-8로 인코딩되고 그 중 하나가 UTF-16으로 인코딩 된 두 파일의 텍스트 행을 계산하려면 각 파일에 대해 FileInputStream 주위에 InputStreamReader을 만들고 적절한 인코딩을 지정하십시오 매번.

(개인적으로 나는 완전히 FileReader을 피할 것 - 그것은 당신이 인코딩을 지정하지 않는다는 사실은 IMO가 쓸모가 있습니다.)

+2

일을'FileReader' 그렇게 빌어 먹을 쓸모가 있음을 언급합니다. :) – Bombe

+0

왜'FileInputStream'은'InputStreamReader'와 같은 간단한 UTF-8 인코딩 된 텍스트를 해석합니까? Peter Lawrey가 말한대로입니까? 텍스트에 모호한 문자를 추가하는 경우에만 차이점을 알 수 있습니까? – wulfgarpro

+2

@ WulfgarPro : 그렇지 않습니다. 원시 바이트를 읽습니다. 이러한 raw 바이트를 System.out에 보내면 System.out (PrintStream)은 기본 플랫폼 인코딩을 사용하여 콘솔에 출력합니다. –

3

InputStream은 바이트를 읽는 반면 Reader은 문자를 읽습니다. 바이트가 문자로 매핑되는 방식으로 인해 InputStreamReader을 만들 때 문자 집합 (또는 인코딩)을 지정해야합니다. 기본값은 플랫폼 문자 집합입니다.

1

> 127 일 수있는 문자가 포함 된 텍스트를 읽거나 쓸 때 char 스트림을 사용하십시오. 바이너리 데이터를 읽고 쓸 때 바이트 스트림을 사용하십시오.

원하는 경우 바이너리로 텍스트를 읽을 수 있지만, 많은 가정을하지 않으면 텍스트가 거의 읽히지 않습니다.