様々なクラス②:BufferedWriter・BufferedReaderクラス
BufferedWriter・BufferedReader
バッファリングによる効率化
前項のFileWriterとFileReaderは、ファイルの読み書きを1文字ずつ行うため、使い勝手は今一つです。BufferedWriterとBufferedReaderは、ある程度データをまとめて(溜めて)から一度に入出力を行うバッファリング機能を持つクラスです。これにより、効率よくファイルの読み書きができます。
BufferedWriterはFileWriterを、BufferedReaderはFileReaderをそれぞれラップ(包み込む)して使用します。
BufferedWriterでFileWriterをラップする
bw = new BufferedWriter(new FileWriter(FileName));
BufferedReaderでFileReaderをラップする
br = new BufferedReader(new FileReader(FileName));
サンプルプログラム
ClassSample1.java
package class2;
import java.io.*;
public class ClassSample1 {
public static void main(String[] args) {
BufferedWriter bw = null;
BufferedReader br = null;
String FileName = "filesample2.txt";
try{
bw = new BufferedWriter(new FileWriter(FileName));
bw.write("もも\r\n");
bw.write("うめ\r\n");
bw.write("さくら\r\n");
bw.flush();
br = new BufferedReader(new FileReader(FileName));
String s;
while((s = br.readLine()) != null){
System.out.println(s);
}
}catch(FileNotFoundException e1){
System.out.println("ファイルエラーです。");
}catch(IOException e2){
System.out.println("IOエラーです。");
}finally{
try{
if(bw != null) bw.close();
if(br != null) br.close();
}catch(IOException e){
System.out.println("クローズ失敗");
}
}
}
}
もも
うめ
さくら
うめ
さくら
BufferedReaderのreadLine()メソッドを使うと、1行単位で文字列を読み込めます。ファイルの末尾に達するとnullを返すため、nullを終了条件にしています。(図2-1)
図2-1:filesample2.txtの中身
コンソールからの文字の読み出し
BufferedReaderでコンソールから文字列入力
BufferedReaderは、System.inをInputStreamReaderでラップすることで、コンソール(キーボード)からの入力にも使用できます。
Systemクラスのinフィールドのラッピング
br = new BufferedReader(new InputStreamReader(System.in));
ClassSample2.java
package class2;
import java.io.*;
public class ClassSample2 {
public static void main(String[] args) {
BufferedReader br = null;
try{
br = new BufferedReader(new InputStreamReader(System.in));
while(true){
String s;
System.out.print("InputData(q : finish) : ");
s = br.readLine();
if(s.equals("q")){
break;
}
System.out.println("Input Data:" + s);
System.out.println();
}
}catch(IOException e2){
System.out.println("IOエラー");
}finally{
try{
if(br != null) br.close();
}catch(IOException e){
System.out.println("IOエラー");
}
}
}
}
InputData(q : finish) : abcdefg
Input Data:abcdefg
InputData(q : finish) : hijeklmno
Input Data:hijeklmno
InputData(q : finish) : q
Input Data:abcdefg
InputData(q : finish) : hijeklmno
Input Data:hijeklmno
InputData(q : finish) : q
「q」を入力するとbreakでループを抜けて終了します。readLine()を使うことで、1行単位でキーボード入力を受け取ることができます。