FileWriter、FileReaderを使ってファイルを読み書きする
まずファイル名を指定し、Fileオブジェクトを生成します。
それをもとにキャラクタストリームである「FileWriter」「FileReader」を使って、char単位で読み書きを行います。
ちなみにキャラクターストリームを使用すると、文字コードが自動的に変換されるので、ファイルが保存されているOSの文字コードを意識することなく入出力を行えます。
以下のコードは、「text.txt」というファイルを生成し書き込みを行ったのち、
そのファイルの中身を読み込んで出力しているというプログラムです。
import java.io.*;
public class Main {
public static void main(String[] args) {
try (FileWriter text1 = new FileWriter(new File("text.txt"));
FileReader text2 = new FileReader(new File("text.txt"))) {
text1.write("こんにちは。");
text1.flush();
int i = 0;
while ((i = text2.read()) != -1) {
System.out.print((char) i);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
「こんにちは」と書き込んだあとにflush()メソッドを使用していますが、これは呼び出した瞬間に強制的にファイルへ書き込みを行うよう命令する処理を意味します。
一つ前に実行しているwrite()メソッドはデータの書き込みを要求しますが、このメソッドを呼び出したすぐにファイルに書き込まれるとは限りません。このプログラムでは、最初に書き込んだ文字を読み込んで出力したいため、必ず読み込み前に書き込みが行われているように強制的な書き込みを命じています。
また、while文の中では、FileReaderクラスのread()メソッドを使用してファイルに書き込まれている文字を一文字ずつ取得しint型で返しています。read()メソッドは1回実行するたびに1文字読み込みを行い、ファイルの終わりに達すると-1を返すため、その条件を判定文に入れています。
read()メソッドで取得したint型の情報を文字として出力するためには、char型への明示的なキャストが必要なため、キャスト式を書いてchar型に変換しています。
このような処理を行い、ファイルの読み書きを行うことができます。
次回はBufferedReader,BefferedWriterクラスや、シリアライズ等について記載できたらと思います。