1.1 より前の JDK の標準入出力機能では、InputStream および OutputStream クラスとこれらのサブクラスを使用するバイトストリームだけがサポートされていました。文字ストリームはバイトストリームと似ていますが、文字ストリームには、8 ビット単位のバイトではなく 16 ビットの Unicode 文字が含まれます。文字ストリームは、Reader クラスと Writer クラス、およびこれらのサブクラスによって実装されます。Reader および Writer では、InputStream および OutputStream と基本的に同じ操作がサポートされます。ただし、バイトストリームのメソッドがバイトまたはバイト配列を操作するのに対し、文字ストリームのメソッドは、文字、文字配列、または文字列を操作する点が異なります。
バイトストリームで利用できる機能のほとんどは、文字ストリームでも利用できます。文字ストリームクラスとバイトストリームの名前にも同じことが言えます。文字ストリームクラスの接頭辞には、通常は対応するバイトストリームクラスの名前と同じものが使用されています。たとえば、PushbackReader クラスでは、PushbackInputStream クラスからバイトストリームに提供される機能が文字ストリームにも提供されます。
Java では、文字列が Unicode で格納されます。Unicode は国際標準の文字エンコーディングで、各国のほとんどの記述用言語を表すことができます。ただし、ユーザーが読むことのできる標準的なテキストファイルでは、Unicode または ASCII に関連しないエンコーディングが使用されていることがあります。エンコーディングには、さまざまな方法があります。文字ストリーム機能では、バイトストリームおよび文字ストリームの変換を行う 2 つのクラスが提供されます。このため、エンコーディング処理の複雑さが解消されています。InputStreamReader クラスでは、バイト入力ストリームからバイトを読み込み、エンコーディングに応じて文字に変換する文字入力ストリームが実装されます。同様に、OutputStreamWriter クラスでは、エンコーディングに応じて文字をバイトに変換し、バイト出力ストリームに書き込む文字出力ストリームが実装されます。
文字ストリームの 2 つ目の利点は、バイトストリームよりも効率的なことです。Java 独自のバイトストリームのほとんどの実装では、読み込みおよび書き込み操作が一度に 1 バイト単位で行われます。これに対し、文字ストリームクラスでは、読み込みおよび書き込み操作が一度に 1 バッファー単位で行われます。文字ストリームクラスでは、この利点とより効率的なロック方式によって、エンコーディング変換によって追加されたオーバーヘッドが多くの場合相殺されます。
文字ストリームクラス | 説明 | 対応するバイトクラス |
---|---|---|
Reader | 文字入力ストリームの抽象クラス | InputStream |
BufferedReader | 入力をバッファーに格納し、行を構文解析する | BufferedInputStream |
LineNumberReader | 行番号を追跡する | LineNumberInputStream |
CharArrayReader | 文字配列から読み込む | ByteArrayInputStream |
InputStreamReader | バイトストリームを文字ストリームに変換する | (なし) |
FileReader | ファイルのバイトを文字ストリームに変換する | FileInputStream |
FilterReader | フィルタをかけられた文字入力の抽象クラス | FilterInputStream |
PushbackReader | 文字をプッシュバックする | PushbackInputStream |
PipedReader | PipedWriter から読み込む | PipedInputStream |
StringReader | String から読み込む | StringBufferInputStream |
Writer | 文字出力ストリームの抽象クラス | OutputStream |
BufferedWriter | 出力をバッファーに格納し、プラットフォームの行区切り文字を使用する | BufferedOutputStream |
CharArrayWriter | 文字配列に書き込む | ByteArrayOutputStream |
FilterWriter | フィルタをかけられた文字出力の抽象クラス | FilterOutputStream |
OutputStreamWriter | 文字ストリームをバイトストリームに変換する | (なし) |
FileWriter | 文字ストリームをバイトファイルに変換する | FileOutputStream |
PrintWriter | 値およびオブジェクトを Writer に出力する | PrintStream |
PipedWriter | PipedReader に書き込む | PipedOutputStream |
StringWriter | String に書き込む | (なし) |
PrintStream クラスを変更したことによって、ASCII 以外のローカルエンコーディングが使用されているプラットフォームで Java プログラムを記述している場合、System.out および System.err が使いやすくなりました。つまり、PrintStream は、主にデバッグと既存のコードとの互換性のために提供されています。テキスト出力を生成するコードでは、新しい PrintWriter クラスを使用してください。このクラスでは、文字エンコーディングを指定することも、デフォルトのエンコーディングを受け入れることもできます。PrintWriter クラスでは、OutputStream オブジェクトを受け取るコンストラクタが提供され、デフォルトのエンコーディングを使用する中間 OutputStreamWriter オブジェクトが作成されます。
次のコンストラクタおよびメソッドでは、バイトと文字が適切に変換されないため、使用しないことをお勧めします。
次のコンストラクタおよびメソッドが追加されました。
StreamTokenizer(Reader) | |
byte[] | String.getBytes() |
void | Throwable.printStackTrace(PrintWriter) |