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

5フィルタ入出力

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

フィルタ入出力

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

【文字ストリーム】
FilterReaderクラス
FilterWriterクラス
【バイトストリーム】
FilterInputStreamクラス
FilterOutputStreamクラス

概要

Javaではデータ入出力の際に「データ変換」、「データのバッファリング」などフィルタ処理を行う入出力クラスが用意されています。FilterReaderクラス、FilterWriterクラス、FilterInputStreamクラス、FilterOutputStreamクラスはそれらフィルタ処理を行う入出力クラスのスーパークラスです。実際のフィルタ処理はスーパークラスを継承したサブクラスで行います。以下にそのサブクラスを記載します。スーパークラスを継承することで独自のフィルタクラスを作成することもできます。

フィルタ関連クラス

スーパークラス サブクラス 説明
FilterReader PushbackReader 読み込むデータの先読み処理
FilterWriter
FilterInputStream DataInputStream マシンに依存しないデータの読み込み処理
BufferedInputStream 読み込みデータのバッファリング
PushbackInputStream 読み込むデータの先読み処理
FilterOutputStream DataOutputStream マシンに依存しないデータの書き込み処理
BufferedOutputStream 書き込みデータのバッファリング
PrintStream テキスト出力処理

フィルタ入出力はフィルタ処理を行いたい他の入出力処理と連携して使用します。例えば、ファイル入力処理の際にフィルタ入力処理の1つであるバッファ入力処理を行いたい場合、バッファ入力オブジェクト生成の際のコンストラクタの引数にファイル入力オブジェクトを指定します。このことをバッファ入力クラスでファイル入力クラスをラップすると言います。

フィルタ入出力1

入出力のラップは任意の数だけラップすることができます。例えば、ファイル入力処理をフィルタ入力処理の1つであるバッファ入力処理でラップし、それをまたフィルタ入力処理の1つであるデータ変換入力処理でラップすると言った形です。

フィルタ入出力2

コンストラクタ

フィルタ入出力処理で使用されるクラスで用意されている主なコンストラクタを紹介します。

DataInputStreamクラス

コンストラクタ 説明
DataInputStream
(InputStream)
引数に指定されたInputStreamオブジェクトに対し、マシンに依存しないデータ読み込み処理を行うオブジェクトを生成します。

BufferedInputStreamクラス

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

DataOutputStreamクラス

コンストラクタ 説明
DataOutputStream
(OutputStream)
引数に指定されたOutputStreamオブジェクトに対し、マシンに依存しないデータ書き込み処理を行うオブジェクトを生成します。

BufferedOutputStreamクラス

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

例1

//バッファ出力処理を行いたいFileOutputStreamクラスのオブジェクトoutFileを
//BufferedOutputStreamクラスのコンストラクタの引数に指定し、
//BufferedOutputStreamクラスのオブジェクトoutBufferを生成します。
FileOutputStream outFile = new FileOutputStream("xyz.txt");
BufferedOutputStream outBuffer = new BufferedOutputStream(outFile);

//バッファ入力処理を行いたいFileInputStreamクラスのオブジェクトinFileを
//BufferedInputStreamクラスのコンストラクタの引数に指定し、
//BufferedInputStreamクラスのオブジェクトinBufferを生成します。
//マシンに依存しないデータ読み込み処理を行うため、
//DataInputStreamクラスのコンストラクタの引数にinBufferを指定し、
//DataInputStreamクラスのオブジェクトinDataを生成します。
FileInputStream inFile = new FileInputStream("abc.txt");
BufferedInputStream inBuffer = new BufferedInputStream(inFile);
DataInputStream inData = new DataInputStream(inBuffer);

使用例

フィルタ入出力の内、DataInputStreamクラス、DataOutputStreamクラスを使用した例を記載します。DataInputStreamクラス、DataOutputStreamクラスはJavaのデータ型を使用してデータの入出力を行います。そのため、文字データで入出力を行うFileReaderクラス、FileWriterクラスなどのように、データ入出力処理がマシンに依存することはありません。

【例2】会員情報(ID、パスワード、氏名、住所、日付)をDataOutputStreamを使用し、ファイルに書き込みます。ファイルに書き込まれたデータをDataInputStreamを使用して読み込み、ID、氏名を表示するプログラムです。

import java.io.*;

public class ExIO5 {
    public static void main(String[] args) {
        try {
            //(1)DataOutputStreamオブジェクトの生成
            DataOutputStream out = new DataOutputStream
                (new FileOutputStream("member.txt"));
            String[] ids = {"aaa", "bbb", "ccc"};
            String[] passes = {"xxx", "yyy", "zzz"};
            String[] names = {"田中", "山田", "佐藤"};
            String[] addresses = {"Tokyo", "Osaka", "Nagoya"};
            int[] dates = {20021023, 20021030, 20021015};
            //(2)配列中のデータをmember.txtへ書き込み
            for (int i = 0; i < ids.length; i ++) {
                out.writeUTF(ids[i]);  //(3)文字列の書き込み
                out.writeChar('\t');  //(4)タグの書き込み
                out.writeUTF(passes[i]);
                out.writeChar('\t');
                out.writeUTF(names[i]);
                out.writeChar('\t');
                out.writeUTF(addresses[i]);
                out.writeChar('\t');
                out.writeInt(dates[i]);  //(5)int型の書き込み
                out.writeChar('\n');  //(6)改行の書き込み
            }
            out.close();  //(7)書き込みストリームのクローズ処理
        } catch (IOException e) {
        }

        try {
            //(8)DataInputStreamオブジェクトの生成
            DataInputStream in = new DataInputStream
               (new FileInputStream("member.txt"));
            String id;
            String name;
            try {
                //(9)member.txt内のデータの読み込み
                while (true) {
                    id = in.readUTF();  //(10)文字列の読み込み
                    in.readChar();  //(11)タグの読み込み
                    in.readUTF();
                    in.readChar();
                    name = in.readUTF();
                    in.readChar();
                    in.readUTF();
                    in.readChar();
                    in.readInt();  //(12)int型の読み込み
                    in.readChar();  //(13)改行の読み込み
                    //(14)変数name、変数idの表示
                    System.out.println(name + "さんのIDは" + id + "です。");
                }
            } catch (EOFException e) {
            }
            in.close();  //(15)読み込みストリームのクローズ処理
        } catch (IOException e) {
        }
    }
}

解説2

  1. (1)書き込みを行うファイル(member.txt)に対するFileOutputStreamオブジェクトを引数にDataOutputStreamクラスのオブジェクトoutを生成します。DataOutputStreamクラスでFileOutputStreamクラスをラップしています。
  2. (2)配列中のデータをforループを使用し、順番にmember.txtへ書き込みます。
  3. (3)writeUTFメソッドを使用し、文字データids[i]の書き込み処理を行います。
  4. (4)writeCharメソッドを使用し、タグ\tの書き込み処理を行います。
  5. (5)writeIntメソッドを使用し、int型データdates[i]の書き込み処理を行います。
  6. (6)writeCharメソッドを使用し、改行\nの書き込み処理を行います。
  7. (7)書き込みストリームをクローズします。
  8. (8)読み込みを行うファイル(member.txt)に対するFileInputStreamオブジェクトを引数にDataInputStreamクラスのオブジェクトinを生成します。DataInputStreamクラスでFileOutputStreamクラスをラップしています。
  9. (9)whileループを使用し、member.txt内のデータの読み込み処理を行います。通常読み込み処理の終了判定では「while((line = in.read( )) != -1)」などwhile文で-1やnullを判定に使用します。しかしDataInputStreamクラスでは用意されているメソッドが正常な値を-1やnullと読み込む場合があります。そのため、終了判定に例外EOFExceptionを使用します。読み込みデータがなくなるとEOFExceptionをスローするため、その段階でwhileループを抜けます。
  10. (10)readUTFメソッドを使用し、文字データの読み込み処理を行います。読み込んだデータをString型変数idに代入します。
  11. (11)readCharメソッドを使用し、タグの読み込み処理を行います。
  12. (12)readIntメソッドを使用し、int型データの読み込み処理を行います。
  13. (13)readCharメソッドを使用し、改行の読み込み処理を行います。
  14. (14)printlnメソッドを使用し、ID、氏名の表示を行います。
  15. (15)読み込みストリームをクローズします。

実行結果2

D:\JAVA>javac ExIO5.java

D:\JAVA>java ExIO5
田中さんのIDはaaaです。
山田さんのIDはbbbです。
佐藤さんのIDはcccです。

D:\JAVA>

5フィルタ入出力