InputStream クラスはバイト データを読み取るためのストリームを提供し、Reader クラスは文字データ用のストリームを提供します。ストリームから文字データを読み取るために、実際にはバイト ストリームを文字ストリームに変換するブリッジである InputStreamReader を使用します。最初にバイトストリームとして読み取ってから文字ストリームに変換するのではなく、ストリームから直接文字データを読み取ることはできませんか?
2 に答える
いいえ、そうではありません。
その理由の 1 つは、ファイルで使用されている文字エンコーディングによっては、同じ文字が異なるバイト数で表現される場合があるためです。
é
例として取り上げます(アクセントに注意してください):
- ISO-8859-1 では 1 バイトになります。
- UTF-8 では 2 バイトになります。
- UTF-32 では 4 バイトになります。
Reader
これが、 を開いたときに、正しい文字エンコーディングを選択することが非常に重要である理由です(これは、Charset
クラスが Java で具現化しているものです。CharsetDecoder
およびも参照してくださいCharsetEncoder
)。
同じ考慮事項が、たとえば HTTP や XML などにも当てはまります。これらすべてのテクノロジには、使用する文字エンコーディングを指定する何らかの方法があり、「リーダー」が正しく読み取ることができます。
(これは、使用されるエンコーディングによっては、同じ文字が異なるバイトセットで表される可能性があることは言うまでもありません... EBCDICを覚えていますか?)
入力ストリームはraw バイトを読み取りますが、文字はCharacter encodingに応じてストリームから派生します。
あなたの質問に関して、文字はなく、バイトのシーケンスのみがあるため、ストリームから直接文字を読み取ることはできません。バイトを文字に変換するには、文字ストリームが必要です。