InputStream
との違いは、 は と読み取られるのに対し、はと読み取られるInputStreamReader
ことです。たとえば、ファイル内のテキストが の場合、どちらも正常に機能します。しかし、テキストが( と 2 つの中国語の文字で構成される)の場合、 は機能しません。InputStream
byte
InputStreamReader
char
abc
a你们
a
InputStream
したがって、 を使用する必要がありますInputStreamReader
が、私の質問は次のとおりです。
文字はどのように認識されますかInputStreamReader
?
a
は 1 バイトですが、中国語の文字は 2 バイトです。1a
バイトとして読み取られ、他の文字は 2 バイトとして認識されるのでしょうか、それともこのテキスト内のすべての文字がInputStreamReader
2 バイトとして読み取られるのでしょうか。
ベストアンサー1
は、InputStream
生のオクテット (8 ビット) データを読み取ります。Java では、このbyte
型は C の型と同等ですchar
。C では、この型を使用して文字データまたはバイナリ データを表すことができます。Java では、このchar
型は C のwchar_t
型と多くの類似点があります。
はInputStreamReader
、データをあるエンコーディングから UTF-16 に変換します。「a你们」がディスク上で UTF-8 としてエンコードされている場合、バイト シーケンス になります。UTF-8 エンコーディングでを61 E4 BD A0 E4 BB AC
渡すと、文字シーケンス として読み取られます。InputStream
InputStreamReader
0061 4F60 4EEC
Javaの文字エンコーディングAPIには、この変換を実行するアルゴリズムが含まれています。Oracle JREでサポートされているエンコーディングのリストは、ここ。ICUプロジェクトこれが実際にどのように機能するかの内部を理解したい場合、ここから始めるのが良いでしょう。
アレクサンダー・ポグレブニャク指摘しているほとんどの場合、エンコーディングを明示的に指定する必要があります。エンコーディングを指定しないbyte
-to-メソッドは、char
JRE デフォルトこれは、オペレーティング システムとユーザー設定に依存します。