流可以一个个的读取,但是有的时候,这样太麻烦,可以把流放到集合里,通过集合获取流。Java 通过
SequenceInputStream
为我们实现了这个功能,SequenceInputStream 本身不是流,它里面封装的流才是真正的流。问题是,如何判断 SequenceInputStream 的结束。
每个具体的小流以 -1 结束。每当读到 -1 时,先判断一下,还有没有下一个流,有就接着读,没有,这就是最后一个流。把最后一个流的 -1,作为整个流的 -1
1 概述
SequenceInputStream流的特点:
1 将多个字节读取流合并成一个读取流,将多个源合并成一个源,操作起来方便
2 需要的枚举接口可以通过Collections.enumeration(collection);
来实现
2 代码示例
把 1 2 3 .txt 文件的所有内容,添加到 4.txt
分析,这是个合并动作
枚举,Vector
有枚举,但是 Vector 效率太低,不建议使用
分别用Vector
和ArrayList
来实现这个功能,ArrayList 没有枚举,只能自己去 new 枚举对象
Vector + SequenceInputStream
public static void main(String[] args) throws IOException {
Vector<FileInputStream> v = new Vector<FileInputStream>();
v.add(new FileInputStream("E:\\1.txt"));
v.add(new FileInputStream("E:\\2.txt"));
v.add(new FileInputStream("E:\\3.txt"));
Enumeration<FileInputStream> en = v.elements();
SequenceInputStream sis = new SequenceInputStream(en);
FileOutputStream fos = new FileOutputStream("E:\\4.txt");
byte[] buf = new byte[1024];
int len = 0;
while((len=sis.read(buf))!=-1){
fos.write(buf,0,len);
}
fos.close();
sis.close();
}
ArrayList + SequenceInputStream
public static void main(String[] args) throws IOException {
ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
for(int x=1;x<=3;x++){
al.add(new FileInputStream("E:\\"+x+".txt"));
}
Enumeration<FileInputStream> en = Collections.enumeration(al);
SequenceInputStream sis = new SequenceInputStream(en);
FileOutputStream fos = new FileOutputStream("E:\\4.txt");
byte[] buf = new byte[1024];
int len = 0;
while((len=sis.read(buf))!=-1){
fos.write(buf,0,len);
}
fos.close();
sis.close();
}