ReaderとInputStreamの違いは何ですか?


87

ReaderとInputStreamの違いは何ですか?そして、いつ何を使うのですか?リーダーを使用して文字を読み取ることができる場合、なぜ入力ストリームを使用するのですか?オブジェクトを読み取ると思いますか?


3
「オブジェクトを読み取ると思いますか?」に関しては、Javaオブジェクトを読み書きするための特別な入出力ストリームがあります。それらはそれぞれObjectInputStreamとObjectOutputStreamであり、より大きなシリアル化フレームワークの一部です。 java.sun.com/developer/technicalArticles/Programming/... 他はなど、ソケットを介してデータを送信することができ、入力/出力のいずれか一方のみ使用ストリームだが
マーク・ピーターズ

回答:


138

InputStreamは、リソースから情報を取得するための生のメソッドです。いかなる種類の変換も実行せずに、データをバイトごとに取得します。画像データまたは任意のバイナリファイルを読み取る場合、これが使用するストリームです。

リーダーは文字ストリーム用に設計されています。読んでいる情報がすべてテキストの場合、Readerが文字のデコードを処理し、生の入力ストリームからUnicode文字を提供します。あらゆる種類のテキストを読んでいる場合、これが使用するストリームです。

InputStreamReaderクラスを使用して、InputStreamをラップし、それをReaderに変換できます。

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

完璧な答えベリン!ありがとう!
のGaurav

18

InputStreamsは、ストリームからバイトを読み取るために使用されます。そのため、画像、ビデオ、シリアル化されたオブジェクトなどのバイナリデータに役立ちます。

一方、リーダーは文字ストリームであるため、文字データの読み取りに最適です。


read()バイトごとに使用する場合、およびread(byte[])バイト配列を使用する場合。私が思うに、配列を読む方が常に良いです。次にread()、バイトごとまたはバイトの read(byte[])配列を使用する場所の例を教えてください。または BufferedInputStream。?
Asif Mushtaq 2016

11

私は混乱の元はつまり推測InputStream.read()リターンintReader.read()も返しますint

違いはInputStream.read()、バイトストリームの生の内容に対応する0〜255のバイト値をReader.read()返し、0〜65357の文字値を返すことです(65358の異なるUnicodeコードポイントがあるため)

InputStream例えば、コンテンツが「‡」5バイト(それぞれとして表さのストリームが読み出され、あなたは、内容がバイト単位で読み取ることができint、0と255の間)、その結果97226128161及び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)

Readerあなたは、文字とても内容「‡」3つの文字として読まれることにより、コンテンツの文字を読み込むことができます97822597

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

文字‡はUnicodeではU + 2021と呼ばれます


これは受け入れられた答えでなければなりません。例をありがとう
ダッシュボード

2

InputStreamとReaderの背景:

Javaの初期の頃、コンソール入力を実行する唯一の方法は、バイトストリーム(InputStreamおよびOutputStream)を使用することでした。

ユースケース:

今日では、バイトストリームを使用してコンソールストリームを読み取ることもできます。ただし、商用アプリケーションの場合、コンソール入力を読み取るための推奨される方法は、文字指向のストリーム(リーダー)を使用することです。Readerを使用すると、国際化と保守が容易になります。

注:これは、Java I / Oコードを調査するための単なる追加情報であり、Java I / O実装のデザインパターンはデコレータのデザインパターンに従います。デコレータのデザインパターンに精通している場合は、実装に簡単に追いつくことができます。



0

InputStreamはバイトを受け入れ、Readerは文字を受け入れ、Javaでは1文字= 2バイト、Readerはバッファを使用し、InputStreamは使用しません。すべてのファイルはディスクに保存されるか、バイトに基づいて転送され、画像とビデオが含まれますが、文字はメモリにあるため、InputStreamが頻繁に使用されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.