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

3パイプ入出力

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

パイプ入出力

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

【文字ストリーム】
PipedReaderクラス
PipedWriterクラス
【バイトストリーム】
PipedInputStreamクラス
PipedOutputStreamクラス

概要

パイプ入出力とはある処理の出力を別の処理の入力とする処理のことを言います。例えば売上一覧CSVファイルの中から売上高のみ抜き出し、その売上高を高い順に並べ替える処理を行うプログラムがあるとします。パイプ入出力を使用しない場合は以下のような手順で処理が行われます。

パイプ入出力_1

パイプ入出力を使用した場合は以下のような手順で処理が行われます。

パイプ入出力_2

パイプを使用した場合はある処理((1)売上高の抜出し)の出力を別の処理((2)売上高の並び替え)の入力とすることができるため、中間ファイルを生成する必要はありません。

コンストラクタ

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

PipedReaderクラス

コンストラクタ 説明
PipedReader( ) パイプ処理データを受け取らない、PipedReaderオブジェクトを生成します。
PipedReader(PipedWriter) 引数にパイプ出力データであるPipedWriterオブジェクトを指定します。

PipedWriterクラス

コンストラクタ 説明
PipedWriter( ) パイプ処理データを受け取らない、PipedWriterオブジェクトを生成します。
PipedWriter(PipedReader) 引数にパイプ入力データであるPipedReaderオブジェクトを指定します。

例1

//PipedWriterオブジェクトOutを生成
PipedWriter Out = new PipedWriter();

//引数にPipedWriterオブジェクトOutを指定してPipedReader
//オブジェクトInを生成。オブジェクトOutの処理データがオ
//ブジェクトInに渡される(パイプ処理)。
PipedReader In = new PipedReader(Out);

PipedInputStreamクラス

コンストラクタ 説明
PipedInputStream( ) パイプ処理データを受け取らない、PipedInputStreamオブジェクトを生成します。
PipedInputStream(PipedOutputStream) 引数にパイプ出力データであるPipedOutputStreamオブジェクトを指定します。

PipedOutputStreamクラス

コンストラクタ 説明
PipedOutputStream( ) パイプ処理データを受け取らない、PipedOutputStreamオブジェクトを生成します。
PipedOutputStream(PipedInputStream) 引数にパイプ入力データであるPipedInputStreamオブジェクトを指定します。

例2

//PipedInputStreamオブジェクトInを生成
PipedInputStream In = new PipedInputStream();

//引数にPipedInputStreamオブジェクトInを指定して
//PipedOutputStreamオブジェクトOutを生成。オブジェクト
//Inの処理データがオブジェクトOutに渡される(パイプ処理)。
PipedOutputStream Out = new PipedOutputStream(In);

使用例

パイプ入出力の使用例を記載します。

【例3】売上一覧が記載されたCSVファイル(sales.csv)を読み込み、売上高を抽出します。その後、抽出された売上高を売上の多い順に並び替え表示するプログラムです。

import java.io.*;  //(1)入出力パッケージのインポート

public class ExIO3 {
    //mainメソッド
    public static void main(String[] args) throws IOException {
        ExIO3 object1 = new ExIO3();
        //(2)売上抜出しメソッドgetValueと、
        //   売上ソートメソッドsortValueの呼出
        object1.sortValue(object1.getValue());
    }
    //getValueメソッド
    Reader getValue () throws IOException {
        //(3)FileReaderオブジェクトcsvの生成
        FileReader csv = new FileReader("sales.csv");
        //(4)BufferedReaderクラスでFileReaderクラスの
        //   オブジェクトcsvをラップ
        BufferedReader in = new BufferedReader(csv);

        //(5)PipedWriterオブジェクトpipeOutを生成
        PipedWriter pipeOut = new PipedWriter();
        //(6)PipedReaderオブジェクトpipeInを生成
        PipedReader pipeIn = new PipedReader(pipeOut);
        //(7)PrintWriterクラスでPipedWriterクラスの
        //   オブジェクトpipeOutをラップ
        PrintWriter out = new PrintWriter(pipeOut);

        String line;
        String[] arrayline;

        //(8)読み込みソースがなくなるまで読み込み、
        //   読み込みデータをprintlnメソッドで書き込み
        while((line = in.readLine()) != null) {
            arrayline = line.split(",");
            out.println(arrayline[3]);
            out.flush();
        }

        in.close();  //(9)読み込みストリームのクローズ
        out.close();  //(10)書き込みストリームのクローズ

        return pipeIn;  //(11)pipeInオブジェクトのリターン
    }
    //sortValueメソッド
    void sortValue(Reader source) throws IOException {
        //(12)BufferedReaderクラスで
        //    PipedReaderクラスのオブジェクトsourceをラップ
        BufferedReader in = new BufferedReader(source);

        String line; String[] data = new String[5];
        int m = 0;
        int price1, price2;

        //(13)読み込みソースがなくなるまで読み込み、
        //    読み込みデータを配列dataに代入
        while ((line = in.readLine()) != null) {
            data[m] = line;
            m++;
        }

        //(14)売上データをソート
        for (int i = 0; i < data.length - 1; i++) {
            for (int j = data.length - 1; j > i; j--) {
                price1 = Integer.parseInt(data[j]);
                price2 = Integer.parseInt(data[j-1]);
                if (price1 > price2) {
                    String temp = data[j];
                    data[j] = data[j-1];
                    data[j-1] = temp;
                }
            }
        }

        //(15)ソートされた売上データを出力
        for (int k = 0; k < data.length; k++) {
            System.out.println(data[k]);
        }
        in.close();  //(16)読み込みストリームのクローズ
    }
}

sales.csvファイル

2002/10/10,洗濯機,SHARP,100
2002/10/10,掃除機,MITHUBISHI,200
2002/10/10,乾燥機,HITACHI,50
2002/10/10,テレビ,SONY,600
2002/10/10,DVDプレーヤー,KENWOOD,300

解説3

  1. (1)入出力処理を行うため、java.ioパッケージをインポートします。
  2. (2)売上高抽出メソッドgetValueを呼び出し、その返り値を引数に売上高ソートメソッドsortValueを呼び出します。
  3. (3)CSVファイルを読み込むため、FileReaderオブジェクトcsvを生成します。
  4. (4)BufferedReaderクラスでFileReaderクラスのオブジェクトcsvをラップします。
    BufferedReaderクラスを使用して読み込みデータの読み込みを行うと、読み込み効率が良くなります。
  5. (5)PipedWriterクラスのオブジェクトpipeOutを生成します。
  6. (6)引数にpipeOutを指定して、PipedReaderクラスのオブジェクトpipeInを生成します。pipeOutオブジェクトを使用してのデータの出力がpipeInオブジェクトを使用してのデータの入力として利用できます。
  7. (7)PrintWriterクラスでPipedWriterクラスのオブジェクトpipeOutをラップします。PrintWriterクラスで用意されている便利なメソッド(ここではprintlnメソッド)が使用できるようになります。
  8. (8)読み込みデータがなくなるまでCSVファイルの読み込みを行います。readLineメソッドがnullを返すとファイルの終端を表します。whileループ内ではsplitメソッドを使用して売上高を抽出しています。「out.println(arrayline[3])」で書き込まれたデータはパイプ処理によりpipeInオブジェクトに渡されます。
  9. (9)読み込みストリームを閉じます。
  10. (10)書き込みストリームを閉じます。
  11. (11)パイプ処理により売上データが格納されたpipeInオブジェクトを返します。pipeInオブジェクトはsortValueメソッドの引数になります。
  12. (12)sortValueメソッドの引数に指定されたsourceオブジェクト(pipeInオブジェクト)をBufferedReaderクラスでラップします。
  13. (13)読み込みデータがなくなるまでBufferedReaderクラスのオブジェクトInのデータ(sourceオブジェクトのデータ)を読み込みます。読み込んだデータを配列dataに代入します。
  14. (14)配列データ内の売上データをソートします。
  15. (15)ソートされた売上データをprintlnメソッドで表示します。
  16. (16)読み込みストリームを閉じます。

実行結果3

D:\JAVA>javac ExIO3.java

D:\JAVA>java ExIO3
600
300
200
100
50

D:\JAVA>

3パイプ入出力