28. Java IO: SequenceInputStream

想要查看此教程的目录请点击:Java IO教程目录贴地址


SequenceInputStream可以将两个或更多个InputStream合并成一个。它会首先读取第一个的全部字节,然后第二个。这就是叫SequenceInputStream的原因,因为它是安顺序读取的。

28. Java IO: SequenceInputStream_第1张图片

SequenceInputStream例子

是时候通过一个例子来看如何使用它了。在使用之前得先在类里面导入这个:

import java.io.SequenceInputStream;

下面让我们来看一个具体的例子:

InputStream input1 = new FileInputStream("c:\\data\\file1.txt");
InputStream input2 = new FileInputStream("c:\\data\\file2.txt");

SequenceInputStream sequenceInputStream =
    new SequenceInputStream(input1, input2);

int data = sequenceInputStream.read();
while(data != -1){
    System.out.println(data);
    data = sequenceInputStream.read();
}

例子中的java代码首先实例化两个InputStream。FileInputStream继承自InputStream,所以它们可以用在sequenceInputStream中。
然后,例子创建了一个SequenceInputStream实例。利用两个参数的构造方法,这两个参数为InputStream类型,这就是如何合并两个输入流的办法。
两个InputStream实例可以被SequenceInputStream合并在一起就像一个连贯的流。当第二个流都被写过之后,SequenceInputStream的read()方法就会返回 -1,就是其他的输入流一样。

合并更多数量的流

你可以有两种办法来来并不更多的流。第一种办法就是把所有的实例放入一个Vector,然后把Vector传给SequenceInputStream的构造方法。下面是其示例:

InputStream input1 = new FileInputStream("c:\\data\\file1.txt");
InputStream input2 = new FileInputStream("c:\\data\\file2.txt");
InputStream input3 = new FileInputStream("c:\\data\\file3.txt");

Vector streams = new Vector<>();
streams.add(input1);
streams.add(input2);
streams.add(input3);

SequenceInputStream sequenceInputStream =
    new SequenceInputStream(streams.elements()))
    
int data = sequenceInputStream.read();
while(data != -1){
    System.out.println(data);
    data = sequenceInputStream.read();
}
sequenceInputStream.close();

第二种办法是把InputStream合并至SequenceInputStream,再将两个InputStream合并至另一个SequenceInputStream,最后将两个SequenceInputStream合并到一个SequenceInputStream中:

SequenceInputStream sequenceInputStream1 =
        new SequenceInputStream(input1, input2);

SequenceInputStream sequenceInputStream2 =
        new SequenceInputStream(input3, input4);

SequenceInputStream sequenceInputStream =
    new SequenceInputStream(
            sequenceInputStream1, sequenceInputStream2)){

int data = sequenceInputStream.read();
while(data != -1){
    System.out.println(data);
    data = sequenceInputStream.read();
}
sequenceInputStream.close();
28. Java IO: SequenceInputStream_第2张图片

关闭SequenceInputStream

从SequenceInputStream读取完数据后要记得关闭它。关闭的同时也会关闭在读的InputStream示例。关闭只需要调用close()方法,就像下面的一样:

sequenceInputStream.close();

在java7中你也可以用try-with-resources结构。下面代码为如何使用此种结构来关闭流:

InputStream input1 = new FileInputStream("c:\\data\\file1.txt");
InputStream input2 = new FileInputStream("c:\\data\\file2.txt");

try(SequenceInputStream sequenceInputStream =
    new SequenceInputStream(input1, input2)){

    int data = sequenceInputStream.read();
    while(data != -1){
        System.out.println(data);
        data = sequenceInputStream.read();
    }
}

注意这并没有任何显式的调用close()方法。
也要注意FileInputStream的两个示例并没有放在try-with-resources代码块里。这意味着try-with-resources并不会自动关闭两个FileInputStream。然而,当SequenceInputStream被关闭后它也会关闭它读的InputStream,所以FileInputStream也会在SequenceInputStream关闭后被关闭。

你可能感兴趣的:(28. Java IO: SequenceInputStream)