1. 概要

このチュートリアルでは、JavaでSequenceInputStreamクラスを使用する方法を学習します。 特に、このクラスは、一連のファイルまたはストリームを継続的に読み取るのに役立ちます。

Java IOおよびその他の関連するJavaクラスの基本については、JavaIOチュートリアルを参照してください。

2. SequenceInputStreamクラスの使用

SequenceInputStream は、2つ以上のInputStreamオブジェクトをソースとして受け取ります。 指定された順序でソースから次々に読み取ります。 最初のInputStreamからの読み取りが完了すると、2番目から自動的に読み取りを開始します。 このプロセスは、すべてのソースストリームからの読み取りが完了するまで続きます。

2.1. オブジェクトの作成

2つのInputStreamオブジェクトを使用して、 SequenceInputStreamを初期化できます。

InputStream first = new FileInputStream(file1);
InputStream second = new FileInputStream(file2);
SequenceInputStream sequenceInputStream = new SequenceInputStream(first, second);

InputStreamオブジェクトの列挙を使用してインスタンス化することもできます。

Vector<InputStream> inputStreams = new Vector<>();
for (String fileName: fileNames) {
    inputStreams.add(new FileInputStream(fileName));
}
sequenceInputStream = new SequenceInputStream(inputStreams.elements());

2.2. ストリームから読む

SequenceInputStream は、入力ソースから読み取るための2つの簡単なメソッドを提供します。 最初の方法は1バイトを読み取りますが、2番目の方法はバイトの配列を読み取ります。

1バイトのデータを読み取るには、 read()メソッドを使用します。

int byteValue = sequenceInputStream.read();

上記の例では、readメソッドはストリームから次のバイト(0〜255)の値を返します。 ストリームが終了すると、-1を返します。

バイトの配列を読み取ることもできます

byte[] bytes = new byte[100];
sequenceInputStream.read(bytes, 0, 50);

上記の例では、 50 バイトを読み取り、インデックス0から開始して配置します。

2.3. シーケンスの読み取りを示す例

読み取りシーケンスを示すために、2つの文字列が入力ソースとして使用されます。

InputStream first = new ByteArrayInputStream("One".getBytes());
InputStream second = new ByteArrayInputStream("Magic".getBytes());
SequenceInputStream sequenceInputStream = new SequenceInputStream(first, second);
StringBuilder stringBuilder = new StringBuilder();
int byteValue;
while ((byteValue = sequenceInputStream.read()) != -1) {
    stringBuilder.append((char) byteValue);
}
assertEquals("OneMagic", stringBuilder.toString());

上記の例から、 stringBuilder.toString()を出力すると、次の出力が表示されます。

OneMagic

3. 結論

この短い記事では、SequenceInputStreamの操作方法を見てきました。 基礎となるすべての入力ストリームを1つの単一ストリームに結合するだけです

完全なコードサンプルは、GitHubにあります。