Java IO:SequenceInputStream
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实例将被关闭。

