我们有时候会需要把两个文件合并成一个大文件,以便于使用,比如两个分割的rar文件,或者单纯要将电子书合并。
使用类:SequenceInputStream:表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类
推,直到到达包含的最后一个输入流的文件末尾为止。
bingo!接下去就是搭积木了,我们只需将需要的元素添加到容器中,调用vector容器的elements()方法返回枚举类型,在传入到SequenceInputStream构造方法中,至此完成了文件的捆绑操作,然后就和普通的读写没区别。
传入vector容器的类型会有些让人困惑,因为他既不是基本类型,也不是一般的引用类型,而是一个数据流类型!在印象中,数据流类型是动态的,很少被传入容器,可SequenceInputStream偏偏需要一个InputStream的子类,其实InputStream和其他的引用类型没多大区别,需要就传给咯。
下面是代码:
public class ASD {
File f1 = new File("D:\\1.txt"); //需要合并的文件1,2,3.txt
File f2 = new File("D:\\2.txt");
File f3 = new File("D:\\3.txt");
SequenceInputStream sis;
Vector<FileInputStream> vector;
FileOutputStream fos;
public void hb() throws IOException{
vector = new Vector<FileInputStream>(); //创建容器
vector.add(new FileInputStream(f1)); //加入容器中
vector.add(new FileInputStream(f2));
vector.add(new FileInputStream(f3));
Enumeration<FileInputStream> enu = vector.elements(); //将容器转换为枚举类型
sis = new SequenceInputStream(enu); //打开文件 将枚举传入构造函数
fos = new FileOutputStream("d:\\4.txt"); //打开文件
byte[] b = new byte[1024*1024]; //下面很普通的读写操作
int i = 0;
while( (i = sis.read(b))!=-1)
{
fos.write(b,0,i);
}
sis.close();
fos.close();
}
public static void main(String[] args) throws IOException {
ASD h =new ASD();
h.hb();
}
}