在 Java 中,SequenceInputStream 将两个或多个其他 InputStream 合二为一。首先,SequenceInputStream 会读取第一个 InputStream 中的所有字节,然后读取第二个 InputStream 中的所有字节。这就是它被称为 SequenceInputStream 的原因,因为 InputStream 实例是按顺序读取的。
现在我们来看一个如何使用 SequenceInputStream 的示例。
在使用 SequenceInputStream 之前,必须在 Java 类中导入 SequenceInputStream。下面是导入 SequenceInputStream 的方法:
import java.io.SequenceInputStream;
导入语句应位于 Java 类的顶部,就在包声明的下方。
现在让我们看看如何使用 SequenceInputStream。下面是一个简单的 Java 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 代码示例首先创建了两个 FileInputStream 实例。FileInputStream 扩展了 InputStream 类,因此它们可以与 SequenceInputStream 一起使用。
其次,该示例创建了一个 SequenceInputStream 实例。SequenceInputStream 将两个 FileInputStream 实例作为构造函数参数。这就是告诉 SequenceInputStream 结合两个 InputStream 实例的方法。
现在,与 SequenceInputStream 结合在一起的两个 InputStream 实例可以像一个连贯的流一样使用。当没有更多数据可从第二个 InputStream 中读取时,SequenceInputStream read() 方法将像其他 InputStream 一样返回-1。
您可以通过两种方式将两个以上的 InputStream 实例与 SequenceInputStream 结合起来。第一种方法是将所有 InputStream 实例放入一个向量中,然后将该向量传递给 SequenceInputStream 构造函数。下面的示例说明了如何将向量传递给 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 实例合并为 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 实例也会被关闭。