バージョン 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) |
Copyright © 1997.1999 Sun Microsystems, Inc. All Rights Reserved. |
Java ソフトウェア |