这里使用SequenceInputStream合并流对文件合并1进行简化
如果有大于两个输入流需要合并,则使用SequenceInputStream的多参数构造器,其需要参数为Enumeration接口产生的对象,而Vector有一个elements()方法可以返回Enumeration对象
因此我们先将输入流存储到Vector容器中,再由其elements()方法返回一个Enumeration对象给SequenceInputStream初始化,这样一来就将多个流操作转化为了单个流操作
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
/** * 文件合并[使用输入输出流] */
public class mergeFile02 {
private String srcDir;//源头(文件夹)
private List<String> srcPaths;//所有之前分割后的文件存储路径【我们存到容器中】
private String dest;//合并写入的文件
public mergeFile02(String srcDir, String dest) { //构造器中初始化
this.srcDir=srcDir;
this.srcPaths=new ArrayList<>();
this.dest=dest;
init(); //初始化
}
private void init(){ //初始化
File f=new File(this.srcDir);
for(int i = 0; i<f.listFiles().length; i++) { //将分块后的文件夹里的文件名存入容器
this.srcPaths.add(f.listFiles()[i].getAbsolutePath());
}
}
public void merge() throws IOException {
//输出流(1个)
OutputStream os=new BufferedOutputStream(new FileOutputStream(dest,true));
Vector<InputStream> vi=new Vector<>();
SequenceInputStream sis=null;
//输入流(多个)存入Vector
for(int i=0;i<srcPaths.size();i++){
vi.add(new BufferedInputStream(new FileInputStream(srcPaths.get(i))));
}
sis=new SequenceInputStream(vi.elements());//将所有输入流放入SequenceInputStream中
//操作[多流操作成为了单流操作]
byte[] flush=new byte[1024];
int len=-1;
while ((len=sis.read(flush))!=-1){
os.write(flush,0,len);
}
os.flush();
sis.close();
os.close();
}
public static void main(String[] args) throws IOException {
mergeFile02 mf=new mergeFile02("E:/mycode/IO_3/dest","E:/mycode/IO_3/destfinal2.jpg");
mf.merge();
}
}