様々なクラス②:BufferedWriter・BufferedReaderクラス

行単位の入出力を扱う方法を説明します。BufferedWriter・BufferedReaderクラスの使い方を確認します。

クラス 1 2 3 4 5 6 7

様々なクラス②: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)

filesample2.txtの中身

図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

「q」を入力するとbreakでループを抜けて終了します。readLine()を使うことで、1行単位でキーボード入力を受け取ることができます。