Java_文件合并2_使用合并流将多个输出流合并【接文件合并1】

这里使用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();
    }
}
    原文作者:ZC_qrr
    原文地址: https://blog.csdn.net/weixin_42701392/article/details/103741987
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞