「こんにちは、アミーゴ! 昨日、リシさんはFileInputStreamとFileOutputStreamについてお話しました。そして今日はFileReaderクラスとFileWriterクラスについてお話します。」
おそらくすでにご想像のとおり、これらのクラスはすべて、 File オブジェクトと、InputStream、OutputStream、Reader、および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();
}
「ほとんど違いはありません。」
「はい、違いは最小限です。」
GO TO FULL VERSION