2014-01-19 3 views
-1

1 바이트는 Java가 2 바이트를 사용하는 이유와 다른 모든 작업을 바이트로 처리하는 FileInputStream을 사용하는 동안 문자를 저장할 수 있어야합니다.자바가 char 값을 저장하기 위해 2 바이트를 사용하는 이유

+2

ASCII 문자를 저장하는 데 1 바이트가 사용되지 않습니다. Java는 ASCII가 아닌 유니 코드를 사용합니다. – BackSlash

+0

슬프게도 모든 사람이 같은 언어로 의사 소통하지 않기 때문에 1 바이트가 작동하지 않습니다. 일부 [배경 읽기] (http://www.joelonsoftware.com/articles/Unicode.html). – avik

답변

3

Java char 데이터 유형은 16 비트이고, 바이트는 8 비트입니다.

이것은 Java 문자열이 유니 코드 문자열이기 때문에 ASCII 문자열이 아니기 때문에 표준 Java 문자열이 전세계의 대부분의 언어에서 사용될 수 있기 때문입니다.

0

FileInputStream (및 InputStream에서 상속받은 다른 클래스)은 실제로 "바이트 지향"이므로 문자 데이터를 읽는 데 적합하지 않습니다. 텍스트 파일을 읽을 필요가있는 경우

, 당신은 아마 이것을 시도한다 :

new InputStreamReader(new FileInputStream(file), "UTF8") 

는 물론, 사전에 파일 인코딩을 알아야합니다.

파일을 문자열로 읽는 데 필요한 파일이 예외적으로 크지 않은 경우 가장 쉬운 방법은 FileUtils.readFileToString을 호출하는 것입니다. 자세한 내용은 Apache Commons IO javadoc을 참조하십시오.

업데이트-201,301,191,245 : 순진하게도 그들이 바이트 배열로 파일에서 바이트를 읽을 다음 문자열로 바이트 배열을 변환 할 수 있다고 생각하는 사람들에게 : 그것은 멀티 바이트를 포함 할 수 있습니다이 는, UTF-8 작동하지 않습니다 문자. UTF-8로 하나의 바이트를 차지 (+ 0024 U는, "$")

  • 달러 기호 : 다음 사항을 고려 24
  • 유로 기호 (€ ","U + 20AC)은 UTF에서 3 바이트를 차지 -8 : E2 (82) AC는

상황을 상상해

당신이 읽기 "E2 (82)"결국 고정 된 크기의 버퍼의에 하고, "AC"를 가정하는 것은 온 읽을 수 있도록 남아 다음 읽기주기. 바이트 "E2 B2"를 Java 문자로 변환하려고하면 결과가 손상된 텍스트 데이터가됩니다.

+0

** 모든 ** 스트림은 "바이트 지향"입니다 ... 바이트는 바이트입니다. 클래스 간의 유일한 차이점은 해당 바이트를 다른 것으로 강요 (및 버퍼링)하기 위해 노출하는 편리한 메소드입니다. 거대한 제 3 자 의존성을 도입하지 않고도'FileInputStream'에서 바이트의 배열을 읽고'String'으로 쉽게 변환 할 수 있습니다. –

+0

모든 스트림이 "바이트 지향"이며, 정답을 수정한다는 것에 동의합니다. 나는 이것에 동의하지 않는다 : "FileInputStream에서 바이트 배열을 읽어서 문자열로 변환". 복합 (멀티 바이트) 문자의 경우에는 작동하지 않습니다. 유로화 U + 20AC를 고려하십시오. UTF-8 : E2 82 AC에서 3 바이트로 인코딩됩니다. – akhikhl

+0

당신은 실제로 데이터가 컴퓨터/파일간에 어떻게 만들어 지는지, 또는 문자열이 자바로 어떻게 실제로 표현되고 인코딩되는지를 이해하지 못하는 것 같습니다. 힌트 : 바이트입니다. 'new String (byteArray, Charset.forName ("UTF-8")); ' –

관련 문제