文字ストリーム (JDKTM 1.1 から導入)

バージョン 1.1 の JavaTM Development Kit から、java.io パッケージで文字ストリームがサポートされるようになりました。

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 バッファー単位で行われます。文字ストリームクラスでは、この利点とより効率的なロック方式によって、エンコーディング変換によって追加されたオーバーヘッドが多くの場合相殺されます。

API の概要

文字ストリームクラスは、java.io パッケージの既存のバイトストリームクラスに対応するように設計されています。すでに説明したように、各文字ストリームクラス名は、Reader または Writer で終わります。また、対応するバイトストリームクラスが存在する場合は、通常、そのバイトストリームクラス名と同じ接頭辞になります。次の表は、新しいクラス名の一覧です。左の列のインデントは、サブクラスの関係を示しています。
文字ストリームクラス 説明 対応するバイトクラス
 
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

PrintStream クラスは、プラットフォームのデフォルトの文字エンコーディングおよびプラットフォームのデフォルトの行末記号を使用するように変更されました。このため、各 PrintStream には、OutputStreamWriter が組み込まれました。このライターを介してすべての文字が渡され、出力用のバイトが生成されます。println メソッドでは、プラットフォームのデフォルトの行末記号が使用されます。この行末記号は、システムの line.separator プロパティーによって定義されますが、1 つの改行文字 (「\n」) である必要はありません。既存の write メソッドによって出力されたバイトおよびバイト配列は、ライター経由では渡されません。

PrintStream クラスを変更したことによって、ASCII 以外のローカルエンコーディングが使用されているプラットフォームで Java プログラムを記述している場合、System.out および System.err が使いやすくなりました。つまり、PrintStream は、主にデバッグと既存のコードとの互換性のために提供されています。テキスト出力を生成するコードでは、新しい PrintWriter クラスを使用してください。このクラスでは、文字エンコーディングを指定することも、デフォルトのエンコーディングを受け入れることもできます。PrintWriter クラスでは、OutputStream オブジェクトを受け取るコンストラクタが提供され、デフォルトのエンコーディングを使用する中間 OutputStreamWriter オブジェクトが作成されます。

その他のクラス

次のコンストラクタおよびメソッドでは、バイトと文字が適切に変換されないため、使用しないことをお勧めします。

String   DataInputStream.readLine()
InputStream   Runtime.getLocalizedInputStream(InputStream)
OutputStream   Runtime.getLocalizedOutputStream(OutputStream)
  StreamTokenizer(InputStream)
   String(byte ascii[], int hibyte, int offset, int count)
   String(byte ascii[], int hibyte)
void   String.getBytes(int srcBegin, int srcEnd, byte dst[], int dstBegin)

次のコンストラクタおよびメソッドが追加されました。

  StreamTokenizer(Reader)
byte[]   String.getBytes()
void   Throwable.printStackTrace(PrintWriter)

Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.