ほとんどのアプリケーションでは、文字ストリームによるI/Oはバイト・ストリームによるI/Oと同じくらい単純です。 ストリーム・クラスを使用した入出力では、ローカル文字セットとの変換は自動的に行われます。 バイト・ストリームの代わりに文字ストリームを使用するプログラムは、自動的にローカル文字セットに適応し、国際化に対応します。そのため、プログラマは余分な労力を費やさずにすみます。
国際化が急務でない場合は、文字セットの問題に注意を払わずに、単に文字ストリーム・クラスを使用できます。 後で国際化の対応が必要になった場合には、大幅な再コーディングなしでプログラムを適応させられます。 詳細は、『Internationalization』コースを参照してください。
Reader
またはWriter
の子孫クラスです。 バイト・ストリームの場合と同様に、ファイルI/Oに特化した文字ストリーム・クラスとしてFileReader
とFileWriter
があります。 サンプル・プログラムのCopyCharacters
では、この2つのクラスを使用しています。
import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class CopyCharacters { public static void main(String[] args) throws IOException { FileReader inputStream = null; FileWriter outputStream = null; try { inputStream = new FileReader("xanadu.txt"); outputStream = new FileWriter("characteroutput.txt"); int c; while ((c = inputStream.read()) != -1) { outputStream.write(c); } } finally { if (inputStream != null) { inputStream.close(); } if (outputStream != null) { outputStream.close(); } } } }
CopyCharacters
はCopyBytes
とよく似ています。 もっとも重要な違いは、CopyCharacters
では、入出力にFileInputStream
とFileOutputStream
ではなくFileReader
とFileWriter
を使用している点です。 また、CopyBytes
とCopyCharacters
はどちらも、読取りと書込みにint
変数を使用しています。 ただし、CopyBytes
ではint
変数はbyte
値の最後の8ビットを保持するのに対して、CopyCharacters
ではint
変数は文字値の最後の16ビットを保持する点が異なります。
FileReader
ではFileInputStream
を使用し、FileWriter
ではFileOutputStream
を使用しています。
Javaには、バイトと文字との"橋渡し"の役目を持つ、2つの汎用的なストリームがあります。 InputStreamReader
とOutputStreamWriter
です。 ニーズに合った文字ストリーム・クラスがパッケージにない場合は、この2つのストリームを使用して文字ストリームを作成します。 『Custom Networking』コースのソケットに関するレッスンでは、Socket
クラスによって提供されるバイト・ストリームから文字ストリームを作成する方法が説明されています。
"\r\n"
)、復帰のみ("\r"
)、または改行のみ("\n"
)です。 使用される可能性のあるすべての行区切り文字がサポートされているため、一般に使用されているあらゆるオペレーティング・システムで作成されたテキスト・ファイルをプログラムで読み取ることができます。
CopyCharacters
の例を、行指向I/Oを使用するように修正してみましょう。このためには、これまでまだ登場していない、BufferedReader
とPrintWriter
という2つのクラスを使用する必要があります。 これらのクラスの詳細は、『バッファ・ストリーム』および『フォーマット』で確認します。 今のところは、行指向I/Oをサポートするクラスだという点のみに注目してください。
CopyLines
では、BufferedReader.readLine
とPrintWriter.println
を呼び出して、入力と出力を1行ずつ実行します。
import java.io.FileReader; import java.io.FileWriter; import java.io.BufferedReader; import java.io.PrintWriter; import java.io.IOException; public class CopyLines { public static void main(String[] args) throws IOException { BufferedReader inputStream = null; PrintWriter outputStream = null; try { inputStream = new BufferedReader(new FileReader("xanadu.txt")); outputStream = new PrintWriter(new FileWriter("characteroutput.txt")); String l; while ((l = inputStream.readLine()) != null) { outputStream.println(l); } } finally { if (inputStream != null) { inputStream.close(); } if (outputStream != null) { outputStream.close(); } } } }
readLine
を呼び出すと、その行の1行分のテキストが返されます。 CopyLines
プログラムでは、各行の出力にprintln
を使用しています。println
は、現在のオペレーティング・システムに合った行区切り文字を行末に追加します。 ここで追加される文字は、入力ファイルで使用されていた行区切り文字とは異なる可能性があります。
テキストの入力および出力を、文字や行という単位を超えて構造化する方法は数多くあります。 詳細は、『スキャンとフォーマット』を参照してください。