Javaに関する様々な情報をご紹介します。

4バッファ入出力

Javaに関する様々な情報をご紹介します。

バッファ入出力

このページではJavaでの入出力処理のうち、バッファ入出力について説明します。バッファ入出力では以下のクラスを使用します。

【文字ストリーム】
BufferedReaderクラス
BufferedWriterクラス
【バイトストリーム】
BufferedInputStreamクラス
BufferedOutputStreamクラス

概要

バッファ入出力は主にファイル入出力関連クラスと共に使用されます。バッファ入出力を行うことにより以下のような利点があります。

  • FileReaderクラス、FileInputStreamクラス、InputStreamReaderクラスのreadメソッドは呼び出されるたびにファイルにアクセスするため、効率が良くありません。BufferedReaderクラス、BufferedInputStreamクラスのreadメソッドは呼び出されると読み込めるだけのデータを読み込み、バッファにためておきます。そして、readメソッドが呼び出されるたびにバッファからデータを読み込みます。バッファ内のデータがなくなったときにだけ、ファイルにアクセスします。そのため、オーバーヘッドが少なく効率が良いです。
    バッファ入力
  • FileWriterクラス、FileOutputStreamクラス、OutputStreamWriterクラスのwriteメソッドは呼び出されるたびにファイルにアクセスするため、効率が良くありません。BufferedWriterクラス、BufferedOutputStreamクラスのwriteメソッドは呼び出されると書き込みデータを一旦バッファにためておきます。バッファが一杯になるか、flushメソッドが呼び出された時にだけバッファ内のデータをファイルに書き込みます。そのため、オーバーヘッドが少なく効率が良いです。
    バッファ出力
  • バッファ入出力を使用することにより、バッファ関連クラスに用意されている便利なメソッドを使用できるようになります。BufferedReaderクラスには1行ずつデータを読み込む、readLineメソッドが用意されています。

コンストラクタ

バッファ入出力処理で使用されるクラスの主なコンストラクタを紹介します。

BufferedReaderクラス

コンストラクタ 説明
BufferedReader
(Reader)
デフォルトサイズのバッファでバッファリングするオブジェクトを生成します。引数にはバッファリングしたい文字入力ストリーム関連のオブジェクトを指定します。
BufferedReader
(Reader, int)
第2引数で指定されたサイズのバッファでバッファリングするオブジェクトを生成します。引数にはバッファリングしたい文字入力ストリーム関連のオブジェクトを指定します。

BufferedWriterクラス

コンストラクタ 説明
BufferedWriter
(Writer)
デフォルトサイズのバッファでバッファリングするオブジェクトを生成します。引数にはバッファリングしたい文字出力ストリーム関連のオブジェクトを指定します。
BufferedWriter
(Writer, int)
第2引数で指定されたサイズのバッファでバッファリングするオブジェクトを生成します。引数にはバッファリングしたい文字出力ストリーム関連のオブジェクトを指定します。

BufferedInputStreamクラス

コンストラクタ 説明
BufferedInputStream
(InputStream)
デフォルトサイズのバッファでバッファリングするオブジェクトを生成します。引数にはバッファリングしたいバイト入力ストリーム関連のオブジェクトを指定します。
BufferedInputStream
(InputStream, int)
第2引数で指定されたサイズのバッファでバッファリングするオブジェクトを生成します。引数にはバッファリングしたいバイト入力ストリーム関連のオブジェクトを指定します。

BufferedOutputStreamクラス

コンストラクタ 説明
BufferedOutputStream
(OutputStream)
デフォルトサイズのバッファでバッファリングするオブジェクトを生成します。引数にはバッファリングしたいバイト入力ストリーム関連のオブジェクトを指定します。
BufferedOutputStream
(OutputStream, int)
第2引数で指定されたサイズのバッファでバッファリングするオブジェクトを生成します。引数にはバッファリングしたいバイト出力ストリーム関連のオブジェクトを指定します。

例1

//バッファリングしたいFileReaderクラスのオブジェクトinFileを
//コンストラクタの引数に指定します。
FileReader inFile = new FileReader("abc.txt");
BufferedReader inBuffer = new BufferedReader(inFile);

//バッファリングしたいFileOutputStreamクラスのオブジェクト
//outFileをコンストラクタの引数に指定します。
FileOutputStream outFile = new FileOutputStream("AAA.gif");
BufferedOutputStream outBuffer = new BufferedOutputStream(outFile);

使用例

バッファ入出力の使用例を記載します。

【例2】BufferedReaderクラスを使用してファイル(abc.txt)を読み込み、その内容をBufferedWriterクラスを使用してファイル(xyz.txt)に書き込むプログラムです。

import java.io.*;

public class ExIO4 {
    public static void main(String[] args) {
        try {
            //(1)FileReaderオブジェクトinFileを生成
            FileReader inFile = new FileReader("abc.txt");
            //(2)FileWriterオブジェクトoutFileを生成
            FileWriter outFile = new FileWriter("xyz.txt");
            //(3)BufferedReaderオブジェクトinBufferを生成
            BufferedReader inBuffer = new BufferedReader(inFile);
            //(4)BufferedWriterオブジェクトoutBufferを生成
            BufferedWriter outBuffer = new BufferedWriter(outFile);

            String line;

            //(5)読み込みデータがなくなるまで、読み込み
            while ((line = inBuffer.readLine()) != null) {
                //(6)データの書き込み処理
                outBuffer.write(line);
            }

            outBuffer.flush();  //(7)バッファをフラッシュ
            inBuffer.close();  //(8)読み込みストリームのクローズ
            outBuffer.close();  //(9)書き込みストリームのクローズ
        } catch (IOException e) {
        }
    }
}

abc.txtファイル

これはabcファイルの中身です。

解説2

  1. (1)引数に読み込むファイルabx.txtを指定して、FileReaderクラスのオブジェクトinFileを生成します。
  2. (2)引数に書き込むファイルxyz.txtを指定して、FileWriterクラスのオブジェクトoutFileを生成します。
  3. (3)引数にバッファリングするFileReaderクラスのオブジェクトinFileを指定して、BufferedReaderクラスのオブジェクトinBufferを生成します。
  4. (4)引数にバッファリングするFileReaderクラスのオブジェクトinFileを指定して、BufferedReaderクラスのオブジェクトinBufferを生成します。
  5. (5)読み込みデータがなくなるまで、readLineメソッドにより一行ずつデータを読み込みます。readLineメソッドは読み込みデータがなくなるとnullを返します。
  6. (6)writeメソッドによりデータの書き込み処理を行います。
  7. (7)バッファをフラッシュし、バッファ内のデータをファイル(xyz.txt)に書き込みます。
  8. (8)closeメソッドを使用し、読み込みストリームを閉じます。
  9. (9)closeメソッドを使用し、書き込みストリームを閉じます。

実行結果2

D:\JAVA>javac ExIO4.java

D:\JAVA>java ExIO4

D:\JAVA>type xyz.txt
これはabcファイルの中身です。
D:\JAVA>

※ typeコマンドはMS-DOSコマンドで引数に指定されたファイルの中身を表示します。

4バッファ入出力