Reader와 InputStream의 차이점은 무엇입니까?


87

Reader와 InputStream의 차이점은 무엇입니까? 그리고 언제 무엇을 사용합니까? Reader를 사용하여 문자를 읽을 수 있다면 왜 inputstream을 사용할까요? 객체를 읽을까요?


3
"I guess to read objects?"와 관련하여 Java 객체 읽기 / 쓰기를위한 특수 입출력 스트림이 있습니다. 이들은 각각 ObjectInputStream 및 ObjectOutputStream이며 더 큰 직렬화 프레임 워크의 일부입니다. java.sun.com/developer/technicalArticles/Programming/… 그러나 이것은 입력 / 출력 스트림의 한 가지 용도 일 뿐이며 다른 것들은 소켓 등을 통해 데이터를 전송할 수 있습니다.
Mark Peters

답변:


138

InputStream은 리소스에서 정보를 가져 오는 원시 방법입니다. 어떤 종류의 변환도 수행하지 않고 바이트 단위로 데이터를 가져옵니다. 이미지 데이터 또는 바이너리 파일을 읽는 경우 사용할 스트림입니다.

리더는 문자 스트림 용으로 설계되었습니다. 읽고있는 정보가 모두 텍스트 인 경우 리더는 문자 디코딩을 처리하고 원시 입력 스트림에서 유니 코드 문자를 제공합니다. 모든 유형의 텍스트를 읽는 경우 사용할 스트림입니다.

InputStreamReader 클래스를 사용하여 InputStream을 래핑하고 Reader로 전환 할 수 있습니다.

Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);

완벽한 대답 베린! 감사!
Gaurav

18

InputStreams는 스트림에서 바이트를 읽는 데 사용됩니다. 따라서 이미지, 비디오 및 직렬화 된 객체와 같은 이진 데이터에 유용합니다.

반면 리더는 문자 스트림이므로 문자 데이터를 읽는 데 가장 적합합니다.


read()바이트 단위 사용 시기 및 read(byte[])바이트 배열 사용시기 . 내가 생각하기에 배열을 읽는 것이 항상 더 좋습니다. 그런 다음 read()바이트 단위 또는 바이트 read(byte[])배열 을 사용하는 예를 나에게 줄 수 있습니까 ? 또는 BufferedInputStream.?
Asif Mushtaq

11

나는 혼란의 근원이 그 추측 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, 822597

a -> U+0061 -> 0x61 -> 97
‡ -> U+2021 -> 0x2021 -> 8225 (single int, not 3)
a -> U+0061 -> 0x61 -> 97

문자 ‡는 유니 코드에서 U + 2021로 표시됩니다.


이것은 받아 들여진 대답이어야합니다. 예를 들어 주셔서 감사합니다
대시 보드

2

InputStream 및 리더의 배경 :

자바 초기에 콘솔 입력을 수행하는 유일한 방법은 바이트 스트림 (InputStream 및 OutputStream)을 사용하는 것입니다.

사용 사례:

오늘날에는 바이트 스트림을 사용하여 콘솔 스트림을 읽는 것도 허용됩니다. 그러나 상용 응용 프로그램의 경우 콘솔 입력을 읽는 데 선호되는 방법은 문자 지향 스트림 (Reader)을 사용하는 것입니다. Reader를 사용하면 국제화 및 유지 관리가 더 쉬워집니다.

참고 : 이것은 Java I / O 코드를 탐색하기위한 추가 정보 일뿐입니다. Java I / O 구현의 디자인 패턴은 데코레이터 디자인 패턴을 따릅니다. 데코레이터 디자인 패턴에 익숙하다면 구현을 쉽게 따라 잡을 수 있습니다.


1

하나는 바이트를 허용하고 다른 하나는 문자를 허용합니다.


0

InputStream은 바이트를 받아들이고, 판독기는 문자를 받아들이고, Java에서는 한 문자 = 2 바이트이고, 판독기는 버퍼를 사용하고, InputStream은 사용하지 않습니다. 모든 파일은 디스크에 저장되거나 바이트 단위로 전송되며 이미지와 비디오를 포함하지만 문자는 메모리에 있으므로 InputStream을 자주 사용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.