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

6ファイルの連結

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

ファイルの連結

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

【バイトストリーム】
SequenceInputStreamクラス

概要

ファイルの連結では、複数のファイルの読み込み処理を1つのストリームで行う方法を説明します。

ファイルの連結

コンストラクタ

ファイルの連結で使用されるクラスで用意されているコンストラクタを紹介します。

SequenceInputStreamクラス

コンストラクタ 説明
SequenceInputStream
(Enumeration<? extends
InputStream>)
インタフェースEnumerationを実装したオブジェクト(実行時の型がInputStreamである必要がある)から順番に読み込み処理を行うオブジェクトを生成します。
SequenceInputStream
(InputStream, InputStream)
第1引数、第2引数に指定されたInputStreamオブジェクトから順番に読み込み処理を行うオブジェクトを生成します。

例1

//InputStreamクラスを継承したFileInputStreamクラスのオブジェクトを生成
FileInputStream aFile = new FileInputStream("abc.txt");
FileInputStream bFile = new FileInputStream("xyz.txt");

//引数にaFile、bFileを指定し、SequenceInputStreamオブジェクトを生成
//abc.txt、xyz.txtを1つのストリームで読み込むオブジェクトabSequence
SequenceInputStream abSequence = new SequenceInputStream(aFile, bFile);

Enumerationインタフェース

2つ以上のファイルを1つのストリームで読み込む場合、コンストラクタの引数にEnumeration型変数を指定します。Enumeration型変数とはEnumerationインタフェースを実行したクラスのオブジェクト変数のことです(詳細はインタフェースの実装(implements)を参照)。ここでは、SequneceInputStreamオブジェクトを生成する際の、Enumerationインタフェースの使い方について説明します。

Enumerationインタフェースでは以下のメソッドが定義されています。
戻り型 メソッド 説明
boolean hasMoreElements( ) 読み込みソースが存在するか確認するメソッドです。存在する場合はtrue、存在しない場合はfalseを返します。
E nextElement( ) 読み込みソースがある場合は、読み込みソースを返します。ここでは、読み込みソースはSequenceInputStreamクラスで読み込むため、InputStreamオブジェクトを返すよう、作りこむ必要があります。

例2

---説明---

hasMoreElementsメソッドは読み込みファイルがあるかを判定するために使用します。 FileListは読み込むファイル名が格納されたString型配列です。変数countは読み込んだファイルをカウントするための変数です。読み込むファイルがまだ残っている場合はtrueを返します。 hasMoreElementsメソッドはnextElementメソッドから呼び出されます。

public boolean hasMoreElements() {
    if (count < FileList.length) {
        return true;
    } else {
        return false;
    }
}

---説明---

nextElementメソッドは読み込みファイルを参照するオブジェクトを生成するための ものです。生成したオブジェクトはSequenceInputStreamクラスで読み込み処理を行 うため、InputStreamクラスの子孫クラスである必要があります。
hasMoreElementsメソッドを呼び出し、読み込みファイルがある場合、FileInputSt reamオブジェクトを生成します。配列FileListからString型変数nextFileに読み込 むファイル名を代入し、FileInputStreamクラスのコンストラクタの引数に指定して います。
nextElementメソッドはSequenceInputStreamオブジェクトの生成時や、各読み込み ファイルの読み込みソースがなくなった場合に、SequenceInputStreamクラスから呼 び出されます。

public InputStream nextElement() {
    InputStream in = null;
    if (!hasMoreElements()) {
        throw new NoSuchElementException("ファイルはありません。");
    } else {
    String nextFile = FileList[count];
        count++;
        try {
            in = new FileInputStream(nextFile);
        } catch (FileNotFoundException e) {
        }
    }
    return in;
}

使用例

SequenceInputStreamクラスの使用例を説明します。

【例3】3つのファイルaaa.txt、bbb.txt、ccc.txtを1つのストリームで読み込み、読み込んだ内容を表示させるプログラムです。

ExIO9.javaファイル

import java.io.*;

public class ExIO9 {
    public static void main(String[] args) throws IOException {
        //(1)Enumerationインタフェースを実装したFileListオブジェクトを生成
        FileList fl = new FileList(args);
        //(3)SequenceInputStreamオブジェクトexSequenceを生成
        SequenceInputStream exSequence = new SequenceInputStream(fl);
        int contents;

        //(9)InputStreamオブジェクトの読み込み
        while((contents = exSequence.read()) != -1) {
            System.out.write(contents);
        }
        exSequence.close();  //(10)読み込みストリームのクローズ処理
    }
}

FileList.javaファイル

import java.io.*;
import java.util.*;

public class FileList implements Enumeration {
    private String[] FileList;
    private int count = 0;

    public FileList(String[] FileList) {
        this.FileList = FileList;//(2)ファイルの一覧を代入
    }

    //(6)ファイルが存在すればtureを返す
    public boolean hasMoreElements() {
        if (count < FileList.length) {
            return true;
        } else {
            return false;
        }
    }

    //(4)nextElementメソッドの呼出
    public InputStream nextElement() {
        InputStream in = null;
        if (!hasMoreElements()) {  //(5)読み込みファイル有無のチェック
            throw new NoSuchElementException("ファイルはありません。");
        } else {
            String nextFile = FileList[count];
            count++;
            try {
                //(7)FileInputStreamオブジェクトの生成
                in = new FileInputStream(nextFile);
            } catch (FileNotFoundException e) {
            }
        }
        return in;  //(8)FileInputStreamオブジェクトのリターン
    }
}

解説3

  1. (1)Eumerationインタフェースを実装したクラスFileListのオブジェクトflを生成します。
  2. (2)FileListクラスのコンストラクタ内で、プログラム実行時にコマンドラインに指定されたファイル名をString型配列FileListに代入します。
  3. (3)SequenceInputStreamのコンストラクタの引数にEnumeration型変数fl(Enumerationインタフェースを実装したクラスのオブジェクト変数)を指定して、オブジェクトexSequenceを生成します。
  4. (4)SequenceInputStreamクラスのオブジェクトが生成される際、SeqenceInpustStreamのコンストラクタからnextElementメソッドが呼び出されます。
  5. (5)hasMoreElementメソッドを呼び出し、読み込みファイルがあるかチェックをします。
  6. (6)読み込みファイルがある場合はtrueをない場合はfalseを返します。
  7. (7)InputStreamクラスを継承したFileInputStreamクラスのオブジェクトを生成し、InputStream型変数inに代入します。
  8. (8)InputStream型変数inを呼び出し元に返します。
  9. (9)返されたinオブジェクトを読み込み、読み込んだ内容を出力します。読み込んだファイルのデータがなくなった場合、再びnextElementメソッドが呼び出されます。読み込みファイルがなくなった場合、-1が返され、whileループが終了します。
  10. (10)読み込みストリームをクローズします。

実行結果3

D:\JAVA>type aaa.txt
This is a aaa file.

D:\JAVA>type bbb.txt
This is a bbb file.

D:\JAVA>type ccc.txt
This is a ccc file.

D:\JAVA>javac ExIO9.java

D:\JAVA>java ExIO9 aaa.txt bbb.txt ccc.txt
This is a aaa file.

This is a bbb file.

This is a ccc file.

D:\JAVA>

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

6ファイルの連結