0

Java文字ストリームがバイトストリームをラップし、基になるバイトストリームがシステムのデフォルトまたは特別に定義された文字セットに従って解釈されることを理解しています。

私のシステムのデフォルトの文字セットはUTF-8です。

を使用FileReaderしてテキストファイルを読み取ると、基になる。からのバイトを解釈するためにデフォルトの文字セットが使用されるため、すべてが正常に見えますInputStreamReaderInputStreamReaderUTF-8でエンコードされたテキストファイルをUTF-16として読み込むように明示的に定義すると、すべてが明らかに奇妙に見えます。のようなバイトストリームを使用し、FileInputStreamその出力をSystem.outにリダイレクトすると、すべてが正常に見えます。

だから、私の質問は;

  • 文字ストリームを使用すると便利なのはなぜですか?

  • バイトストリームを直接使用するのではなく、文字ストリームを使用するのはなぜですか?

  • 特定の文字セットを定義すると便利なのはいつですか。

4

3 に答える 3

6

文字列を処理するコードは、テキストに関してのみ「考える」必要があります。たとえば、入力ソースを1行ずつ読み取る場合、そのソースの性質を気にする必要はありません。

ただし、ストレージは通常バイト指向であるため、ソースのバイト指向のビュー(でカプセル化InputStream)とソースの文字指向のビュー(でカプセル化)の間で変換を作成する必要がありますReader

したがって、(たとえば)入力ソースのテキスト行をカウントするメソッドは、Readerパラメーターを受け取る必要があります。1つはUTF-8でエンコードされ、もう1つはUTF-16でエンコードされている、2つのファイルのテキスト行をカウントする場合は、ファイルごとInputStreamReaderにaFileInputStreamを作成し、毎回適切なエンコードを指定します。 。

(個人的にはFileReader完全に避けたいと思います。エンコーディングを指定できないという事実により、IMOは役に立たなくなります。)

于 2011-03-18T11:51:37.413 に答える
3

InputStreamバイトを読み取り、Reader読み取りは文字を読み取ります。バイトが文字にマップされる方法のため、を作成するときに文字セット(またはエンコーディング)を指定する必要がありますInputStreamReader。デフォルトはプラットフォームの文字セットです。

于 2011-03-18T11:49:20.323 に答える
1

127を超える可能性のある文字を含むテキストを読み書きする場合は、charストリームを使用してください。バイナリデータの読み取り/書き込みを行う場合は、バイトストリームを使用します。

必要に応じてテキストをバイナリとして読み取ることもできますが、多くの仮定を行わない限り、多くのことを理解することはめったにありません。

于 2011-03-18T11:51:28.587 に答える