PushbackInputStream クラスからバイトストリームに提供される機能は、文字ストリームにも提供されます。
文字ストリームを使用する理由
文字ストリームを使用する主な利点は、特定の文字エンコーディングに依存しないプログラムを簡単に作成できるため、国際化が簡単になることです。
Java では、文字列が Unicode で格納されます。Unicode は国際標準の文字エンコーディングで、各国のほとんどの記述用言語を表すことができます。
ただし、ユーザが読むことのできる標準的なファイルでは、Unicode または ASCII に関連しないエンコーディングが使用されていることがあります。エンコーディングには、さまざまな方法があります。 文字ストリーム機能では、バイトストリームおよび文字ストリームの変換を行う 2 つのクラスが提供されます。このため、エンコーディング処理の複雑さが解消されています。 InputStreamReader クラスでは、バイト入力ストリームからバイトを読み込み、エンコーディングに応じて文字に変換する文字入力ストリームが実装されます。
同様に、OutputStreamWriter クラスでは、エンコーディングに応じて文字をバイトに変換し、バイト出力ストリームに書き込む文字出力ストリームが実装されます。
文字ストリームの 2 つ目の利点は、バイトストリームよりも効率的なことです。 Java 独自のバイトストリームのほとんどの実装では、読み込みおよび書き込み操作が一度に 1 バイト単位で行われます。 これに対し、文字ストリームクラスでは、読み込みおよび書き込み操作が一度に 1 バッファ単位で行われます。 文字ストリームクラスでは、この利点とより効率的なロック方式によって、エンコーディング変換によって追加されたオーバーヘッドが多くの場合相殺されます。
API の概要
文字ストリームクラスは、java.io パッケージの既存のバイトストリームクラスに対応するように設計されています。 すでに説明したように、各文字ストリームクラス名は、Reader または Writer で終わります。また、対応するバイトストリームクラスが存在する場合は、通常、そのバイトストリームクラス名と同じ接頭辞になります。 次の表は、新しいクラス名の一覧です。左の列のインデントは、サブクラスの関係を示しています。
関連する変更
PrintStream
PrintStream クラスは、プラットフォームのデフォルトの文字エンコーディングおよびプラットフォームのデフォルトの行末記号を使用するように変更されました。 このため、各 PrintStream には、OutputStreamWriter が組み込まれました。このライターを介してすべての文字が渡され、出力用のバイトが生成されます。
println メソッドでは、プラットフォームのデフォルトの行末記号が使用されます。この行末記号は、システムの line.separator プロパティによって定義されますが、1 つの改行文字 (「¥n」) である必要はありません。 既存の write メソッドによって出力されたバイトおよびバイト配列は、ライター経由では渡されません。
PrintStream クラスを変更したことによって、ASCII 以外のローカルエンコーディングが使用されているプラットフォームで Java プログラムを記述している場合、System.out および System.err が使いやすくなりました。 つまり、PrintStream は、主にデバッグと既存のコードとの互換性のために提供されています。
テキスト出力を生成するコードでは、新しい PrintWriter クラスを使用する必要があります。新しい PrintWriter クラスでは、文字エンコーディングを指定することも、デフォルトのエンコーディングを受け入れることもできます。PrintWriter クラスでは、OutputStream オブジェクトを受け取るコンストラクタが提供され、デフォルトのエンコーディングを使用する中間 OutputStreamWriter オブジェクトが作成されます。
その他のクラス
次のコンストラクタおよびメソッドでは、バイトと文字が適切に変換されないため、使用しないことをお勧めします。
次のコンストラクタおよびメソッドが追加されました。