こんにちは。「Javaを復習する初心者」です。
今回はファイルの書き込みと読み取りの練習をしました。
書き込み、読み込みをするには、それぞれBufferedWriterクラス、BufferedReaderクラスがあります。
BufferedWriter
ファイルの書き込みはBufferedWriterクラスを使いました。コンストラクタは以下の2つがあります。
- BufferedWriter(Writer out)
- BufferedWriter(Writer out, int sz)
今回は引数が一つの方を使ってみました。引数が2つの方は使ったことありません。
引数にWriterクラスのインスタンスを指定することになってますが、ネットで調べた結果、その継承クラスであるFileWriterクラスを使うのが一般的なようです。コンストラクタは以下があります。
- FileWriter(File file)
- FileWriter(File file, boolean append)
- FileWriter(FileDescriptor fd)
- FileWriter(String fileName)
- FileWriter(String fileName, boolean append)
下の2つを使うのが話が早い気がします。直接ファイル名を記述します。新規作成ならFileWriter(String fileName)を使い、追記ならFileWriter(String fileName, boolean append)の第2引数にtrueを指定する使い方です。
書き込みには以下のようなプログラムを書きました。
ソース前半
String finaName = "testLog/test.txt";
try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(finaName))){
bufferedWriter.write("test" + String.valueOf(System.currentTimeMillis()));
bufferedWriter.newLine();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
bufferedWriter.write("test" + String.valueOf(System.currentTimeMillis()));
bufferedWriter.newLine();
} catch (IOException e) {
e.printStackTrace();
}
ファイルにはフォルダを含むことができますが、フォルダ自体がないとエラーになります。FileNotFoundExceptionが発生します。String型変数finaNameにファイルのパスを格納しています。Eclipseを使っているため、プロジェクト直下からのパスになります。
BufferedWriter#writeメソッドで書き込むことができます。どのような内容を書き込むか悩んだ結果、Systemクラスに用意されているcurrentTimeMillisメソッドを使うことにしました。ミリ秒で表される現在の時間を返します。その直後にBufferedWriter#newLineメソッドで改行しています。そしてもう一度ミリ秒を取得しているのですが、そのまま連続して書くとミリ秒が同じ値になる場合があったため、Thread#sleepメソッドで一秒待つことにしました。
BufferedReader
次は読み込みです。BufferedReaderクラスを使いました。コンストラクタは以下の2つです。
- BufferedReader(Reader in)
- BufferedReader(Reader in, int sz)
引数が1つの方を使いました。引数に指定するReaderクラスはFileReaderクラスを使うのが一般的なようです。コンストラクタは以下です。
- FileReader(File file)
- FileReader(FileDescriptor fd)
- FileReader(String fileName)
3番目の直接ファイル名を使う方法を使いました。
ソースは以下です。
ソース後半
try (BufferedReader br = new BufferedReader(new FileReader(finaName))){
String s = br.readLine();
while(s != null){
System.out.println(s);
s = br.readLine();
}
} catch (IOException e) {
e.printStackTrace();
}
readLineメソッドで一行まとめて読み込んでくれます。while文の形は大体このようなやり方が一般的なようです。
さて以上のプログラムを実行すると以下のように出力されます。
結果
test1472025948335
test1472025949336
ミリ秒を取得しているので実行ごとに値は変わります。同じ内容がtestLog/test.txtに保存されてました。