ほとんどのアプリケーションでは、文字ストリームによる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は、現在のオペレーティング・システムに合った行区切り文字を行末に追加します。 ここで追加される文字は、入力ファイルで使用されていた行区切り文字とは異なる可能性があります。
テキストの入力および出力を、文字や行という単位を超えて構造化する方法は数多くあります。 詳細は、『スキャンとフォーマット』を参照してください。