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
实例将被关闭。