Java IO:SequenceInputStream

时间:2020-01-09 10:36:07  来源:igfitidea点击:

Java的" SequenceInputStream"将两个或者多个其他" InputStream"合并为一个。首先,SequenceInputStream将读取第一个InputStream的所有字节,然后读取第二个InputStream的所有字节。这就是它被称为SequenceInputStream的原因,因为InputStream实例是按顺序读取的。

SequenceInputStream示例

现在该看一个如何使用SequenceInputStream的例子了。

在使用SequenceInputStream之前,必须将其导入Java类中。这是导入SequenceInputStream的方法:

import java.io.SequenceInputStream;

此import语句应位于Java类的顶部,紧接在包声明下。

现在让我们看看如何使用SequenceInputStream。这是一个简单的JavaSequenceInputStream示例:

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代码示例首先创建两个FileInputStream实例。 " FileInputStream"扩展了" InputStream"类,因此它们可以与" SequenceInputStream"一起使用。

其次,该示例创建一个SequenceInputStream。给" SequenceInputStream"提供了两个" FileInputStream"实例作为构造函数参数。这就是我们告诉SequenceInputStream组合两个InputStream实例的方式。

现在可以将两个" InputStream"实例与" SequenceInputStream"结合使用,就好像它是一个连贯的流一样。当没有更多的数据要从第二个InputStream读取时,SequenceInputStream的read()方法将返回-1,就像其他InputStream一样。

合并两个以上的输入流

我们可以通过两种方式将两个以上的InputStream实例与equenceInputStream组合在一起。第一种方法是将所有InputStream实例放入Vector中,然后将Vector传递给SequenceInputStream构造函数。这是一个如何将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<InputStream> 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实例2和2合并为SequenceInputStream实例,然后再将它们与另一个SequenceInputStream合并。这是结合两个以上InputStream实例和多个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();

关闭SequenceInputStream

当我们从SequenceInputStream中读取完数据后,我们应该记得将其关闭。关闭SequenceInputStream也将关闭SequenceInputStream正在读取的InputStream实例。

关闭SequenceInputStream是通过调用它的close()方法来完成的。这是关闭SequenceInputStream的样子:

sequenceInputStream.close();

我们还可以使用Java 7中引入的try-with-resources构造。这是如何使用try-with-resources构造使用和关闭SequenceInputStream外观的方法:

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()方法调用。 try-with-resources构造可以解决这一问题。

还要注意,两个FileInputStream实例不是在try-with-resources块内创建的。这意味着try-with-resources块不会自动关闭这两个FileInputStream实例。但是,当关闭SequenceInputStream时,也会关闭它从中读取的InputStream实例,因此,当SequenceInputStream关闭时,两个FileInputStream实例将被关闭。