Reader와 InputStream의 차이점은 무엇입니까? 그리고 언제 무엇을 사용합니까? Reader를 사용하여 문자를 읽을 수 있다면 왜 inputstream을 사용할까요? 객체를 읽을까요?
Reader와 InputStream의 차이점은 무엇입니까? 그리고 언제 무엇을 사용합니까? Reader를 사용하여 문자를 읽을 수 있다면 왜 inputstream을 사용할까요? 객체를 읽을까요?
답변:
InputStream은 리소스에서 정보를 가져 오는 원시 방법입니다. 어떤 종류의 변환도 수행하지 않고 바이트 단위로 데이터를 가져옵니다. 이미지 데이터 또는 바이너리 파일을 읽는 경우 사용할 스트림입니다.
리더는 문자 스트림 용으로 설계되었습니다. 읽고있는 정보가 모두 텍스트 인 경우 리더는 문자 디코딩을 처리하고 원시 입력 스트림에서 유니 코드 문자를 제공합니다. 모든 유형의 텍스트를 읽는 경우 사용할 스트림입니다.
InputStreamReader 클래스를 사용하여 InputStream을 래핑하고 Reader로 전환 할 수 있습니다.
Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
InputStreams는 스트림에서 바이트를 읽는 데 사용됩니다. 따라서 이미지, 비디오 및 직렬화 된 객체와 같은 이진 데이터에 유용합니다.
반면 리더는 문자 스트림이므로 문자 데이터를 읽는 데 가장 적합합니다.
read()
바이트 단위 사용 시기 및 read(byte[])
바이트 배열 사용시기 . 내가 생각하기에 배열을 읽는 것이 항상 더 좋습니다. 그런 다음 read()
바이트 단위 또는 바이트 read(byte[])
배열 을 사용하는 예를 나에게 줄 수 있습니까 ? 또는 BufferedInputStream
.?
나는 혼란의 근원이 그 추측 InputStream.read()
반환 int
하고 Reader.read()
도 반환합니다 int
.
차이점은 InputStream.read()
바이트 스트림의 원시 내용에 해당하는 0에서 255 사이의 바이트 값을 Reader.read()
반환하고 0에서 65357 사이의 문자 값을 반환한다는 것입니다 (65358 개의 서로 다른 유니 코드 코드 포인트가 있기 때문).
은 InputStream
사용자가 콘텐츠를, 바이트, 예를 들어 내용을 바이트 읽을 수의 "‡ (A)은"5 바이트 (AN으로 나타낸 각각의 스트림으로 판독 int
결과 0과 255 사이) 97
, 226
, 128
, 161
그리고 97
어디
a -> U+0061 -> 0x61 (hex) -> 97 (dec)
‡ -> U+2021 -> 0xE280A1 (utf-8 encoding of 0x2021) -> 226 128 161 (1 int per byte)
a -> U+0061 -> 0x61 (hex) -> 97 (dec)
A는 Reader
당신이 문자 때문에 내용의 "‡ A는"3 개 문자로 읽기에 의해 내용의 문자를 읽을 수 97
, 8225
과97
a -> U+0061 -> 0x61 -> 97
‡ -> U+2021 -> 0x2021 -> 8225 (single int, not 3)
a -> U+0061 -> 0x61 -> 97
문자 ‡는 유니 코드에서 U + 2021로 표시됩니다.
InputStream 및 리더의 배경 :
자바 초기에 콘솔 입력을 수행하는 유일한 방법은 바이트 스트림 (InputStream 및 OutputStream)을 사용하는 것입니다.
사용 사례:
오늘날에는 바이트 스트림을 사용하여 콘솔 스트림을 읽는 것도 허용됩니다. 그러나 상용 응용 프로그램의 경우 콘솔 입력을 읽는 데 선호되는 방법은 문자 지향 스트림 (Reader)을 사용하는 것입니다. Reader를 사용하면 국제화 및 유지 관리가 더 쉬워집니다.
참고 : 이것은 Java I / O 코드를 탐색하기위한 추가 정보 일뿐입니다. Java I / O 구현의 디자인 패턴은 데코레이터 디자인 패턴을 따릅니다. 데코레이터 디자인 패턴에 익숙하다면 구현을 쉽게 따라 잡을 수 있습니다.
하나는 바이트를 허용하고 다른 하나는 문자를 허용합니다.