「こんにちは、アミーゴ! 昨日、リシさんはFileInputStreamFileOutputStreamについてお話しました。そして今日はFileReaderクラスとFileWriterクラスについてお話します。」

おそらくすでにご想像のとおり、これらのクラスはすべて、 File オブジェクトと、InputStreamOutputStreamReader、およびWriter の「インターフェイス」との間のアダプターです。

「これらはファイルとリーダー/ライターの間のアダプターに似ていますが、コンストラクターに渡す必要があるのはファイルではなく、文字列オブジェクトだけです。」

「実際には、いくつかのコンストラクターがあります。File オブジェクトと String オブジェクトの両方にコンストラクターがあります。String オブジェクトをコンストラクターに渡すと、コンストラクターは、渡された String オブジェクトから取得したファイル パスを使用して、静かに File オブジェクトを作成します。」

これは便宜上のものです。Java の作成者は、これらのクラスの最も頻繁な使用例を取り上げ、それらすべてのコンストラクターを作成しました。それはとても便利だと思いませんか?

「ああ、そうです。便利です。同意します。でも、なぜ常に次のように書かなければならないのですか。」
BufferedReaderbufferedReader = new BufferedReader(newInputStreamReader(System.in));
「なぜこのユースケースを追加しなかったのですか?」

「ここでの問題は、  典型的な Java プログラムがコンソールでは動作しないことです。実のところ、コンソールから何かを読み取ることはほとんどありません。Webサーバー、アプリケーション サーバー、その他の複雑なシステムであってもです。」

ただし、データとテキストをコンソールに出力するための PrintStream があります。これらの「サーバー アプリケーション」は、ステータス、エラー、その他あらゆる種類の情報を表示するためにコンソールを使用することが多いためです。

「わかりました。FileReader と FileWriter を使用してファイルをコピーすることもできますね?」

「はい、テキスト ファイル (つまり、文字で構成されているファイル) の場合は可能です。例を次に示します。」

ディスク上のファイルをコピーする
public static void main(String[] args) throws Exception
{
 FileReader reader = new FileReader("c:/data.txt");
 FileWriter writer = new FileWriter("c:/result.txt");

 while (reader.ready()) //as long as there are unread bytes in the input stream
 {
  int data = reader.read(); //Read one character (the char will be widened to an int)
  writer.write(data); //Write one character (the int will be truncated/narrowed to a char)
 }

 //Close the streams after we done using them
 reader.close();
 writer.close();
}

「ほとんど違いはありません。」

「はい、違いは最小限です。」