ReaderとInputStreamの違いは何ですか?そして、いつ何を使うのですか?リーダーを使用して文字を読み取ることができる場合、なぜ入力ストリームを使用するのですか?オブジェクトを読み取ると思いますか?
ReaderとInputStreamの違いは何ですか?そして、いつ何を使うのですか?リーダーを使用して文字を読み取ることができる場合、なぜ入力ストリームを使用するのですか?オブジェクトを読み取ると思いますか?
回答:
InputStreamは、リソースから情報を取得するための生のメソッドです。いかなる種類の変換も実行せずに、データをバイトごとに取得します。画像データまたは任意のバイナリファイルを読み取る場合、これが使用するストリームです。
リーダーは文字ストリーム用に設計されています。読んでいる情報がすべてテキストの場合、Readerが文字のデコードを処理し、生の入力ストリームからUnicode文字を提供します。あらゆる種類のテキストを読んでいる場合、これが使用するストリームです。
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の異なるUnicodeコードポイントがあるため)
InputStream
例えば、コンテンツが「‡」5バイト(それぞれとして表さのストリームが読み出され、あなたは、内容がバイト単位で読み取ることができ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)
Reader
あなたは、文字とても内容「‡」3つの文字として読まれることにより、コンテンツの文字を読み込むことができます97
、8225
と97
a -> U+0061 -> 0x61 -> 97
‡ -> U+2021 -> 0x2021 -> 8225 (single int, not 3)
a -> U+0061 -> 0x61 -> 97
文字‡はUnicodeではU + 2021と呼ばれます
InputStreamとReaderの背景:
Javaの初期の頃、コンソール入力を実行する唯一の方法は、バイトストリーム(InputStreamおよびOutputStream)を使用することでした。
ユースケース:
今日では、バイトストリームを使用してコンソールストリームを読み取ることもできます。ただし、商用アプリケーションの場合、コンソール入力を読み取るための推奨される方法は、文字指向のストリーム(リーダー)を使用することです。Readerを使用すると、国際化と保守が容易になります。
注:これは、Java I / Oコードを調査するための単なる追加情報であり、Java I / O実装のデザインパターンはデコレータのデザインパターンに従います。デコレータのデザインパターンに精通している場合は、実装に簡単に追いつくことができます。
1つはバイトを受け入れ、もう1つは文字を受け入れます。