有时候我们需要从多个输入流中读取数据,一个一个依次去读的话费时费力,所以 Java 提供了 SequenceInputStream 来帮助我们将多个输入流合并成一个输入流,SequenceInputStream 会从第一个输入流开始读取,达到末尾之后紧接着读取第二个输入流,以此类推直到末尾。
可以直接在构造方法的参数中指定两个输入流,也可以将多个输入流包装成一个 Enumeration 对象作为参数传入。
SequenceInputStream(Enumeration<? extends InputStream> e)
通过记住参数来初始化新创建的 SequenceInputStream,该参数必须是生成运行时类型为 InputStream 对象的 Enumeration 型参数。
SequenceInputStream(InputStream s1, InputStream s2)
通过记住这两个参数来初始化新创建的 SequenceInputStream(将按顺序读取这两个参数,先读取 s1,然后读取 s2),以提供从此 SequenceInputStream 读取的字节。
available()
返回不受阻塞地从当前底层输入流读取(或跳过)的字节数的估计值,方法是通过下一次调用当前底层输入流的方法。
close()
关闭此输入流并释放与此流关联的所有系统资源。
read()
从此输入流中读取下一个数据字节。
read(byte[] b, int off, int len)
将最多 len 个数据字节从此输入流读入 byte 数组。
public class SequenceInputStreamTest {
private FileOutputStream fos1;
private FileOutputStream fos2;
private FileOutputStream fos3;
private FileOutputStream fos4;
private FileInputStream fis1;
private FileInputStream fis2;
private FileInputStream fis3;
private FileInputStream fis4;
private SequenceInputStream sis;
public static void main(String[] args) {
SequenceInputStreamTest sist = new SequenceInputStreamTest();
sist.writeData();
sist.readData();
}
private void writeData() {
try {
fos1 = new FileOutputStream(new File("D:\\data1.txt"));
fos2 = new FileOutputStream(new File("D:\\data2.txt"));
fos3 = new FileOutputStream(new File("D:\\data3.txt"));
fos4 = new FileOutputStream(new File("D:\\data4.txt"));
fos1.write("111111111".getBytes());
fos2.write("222222222".getBytes());
fos3.write("333333333".getBytes());
fos4.write("444444444".getBytes());
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void readData() {
try {
fis1 = new FileInputStream(new File("D:\\data1.txt"));
fis2 = new FileInputStream(new File("D:\\data2.txt"));
fis3 = new FileInputStream(new File("D:\\data3.txt"));
fis4 = new FileInputStream(new File("D:\\data4.txt"));
sis = new SequenceInputStream(fis1, fis2);
int length = 0;
byte[] arr = new byte[2];
while ((length = sis.read(arr)) != -1) {
System.out.print(new String(arr, 0, length));
}
System.out.println();
fis1 = new FileInputStream(new File("D:\\data1.txt"));
fis2 = new FileInputStream(new File("D:\\data2.txt"));
Vector<FileInputStream> vector = new Vector<FileInputStream>();
vector.add(fis1);
vector.add(fis2);
vector.add(fis3);
vector.add(fis4);
Enumeration<FileInputStream> elements = vector.elements();
sis = new SequenceInputStream(elements);
while ((length = sis.read(arr)) != -1) {
System.out.print(new String(arr, 0, length));
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}