ReaderとInputStreamの違いは何ですか?そして、いつ何を使用するのですか? Readerを使用して文字を読み取ることができる場合、なぜinputstreamを使用するのか、オブジェクトを読み取ると思いますか?
InputStreamは、リソースから情報を取得する生のメソッドです。いかなる種類の変換も実行せずに、バイト単位でデータを取得します。画像データまたは任意のバイナリファイルを読み取る場合、これは使用するストリームです。
Readerは、文字ストリーム用に設計されています。読んでいる情報がすべてテキストである場合、リーダーは文字のデコードを処理し、生の入力ストリームからUnicode文字を提供します。任意のタイプのテキストを読んでいる場合、これは使用するストリームです。
InputStreamReaderクラスを使用して、InputStreamをラップしてリーダーに変換できます。
Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
InputStreamsは、ストリームからバイトを読み取るために使用されます。そのため、画像、ビデオ、シリアル化されたオブジェクトなどのバイナリデータに役立ちます。
一方、リーダーは文字ストリームであるため、文字データの読み取りに最適です。
混乱の原因は、 InputStream.read()
がint
を返し、 Reader.read()
がint
。
違いは、InputStream.read()
はバイトストリームの生のコンテンツに対応する0から255の間のバイト値を返し、Reader.read()
は0から65357の間の文字値を返すことです(65358があるため)異なるユニコードコードポイント)
InputStream
を使用すると、コンテンツをバイト単位で読み取ることができます。たとえば、コンテンツ「a‡a」は5バイトのストリームとして読み取られます。つまり、_97
_、_226
_、_128
_、_161
_および_97
_ここで_a -> U+0061 -> 0x61 -> 97
_および‡ -> U+2021 -> 0xE280A1 (utf-8 encoding of 0x2021) -> 226 128 161
。
Reader
を使用すると、コンテンツを1文字ずつ読み取ることができるため、コンテンツ「a‡a」は3文字として読み取られます_97
_、_8225
_および_97
_ここで_a -> U+0061 -> 0x61 -> 97
_および_‡ -> U+2021 -> 0x2021 -> 8225
_。
1つはバイトを受け入れ、もう1つは文字を受け入れます。