这里使用多个输入流将分割后的文件读取进来,并使用输出流追加写出到目标文件
import java.io.*;
import java.util.ArrayList;
import java.util.List;
/**
文件合并[使用输入输出流]
*/
public class mergeFile {
private String srcDir;//源头(文件夹)
private List<String> srcPaths;//所有之前分割后的文件存储路径【我们存到容器中】
private String dest;//合并写入的文件
public mergeFile(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));
//输入流(多个)
for(int i=0;i<srcPaths.size();i++){
InputStream is=new BufferedInputStream(new FileInputStream(srcPaths.get(i)));
//操作
byte[] flush=new byte[1024];
int len=-1;
while ((len=is.read(flush))!=-1){
os.write(flush,0,len);
}
os.flush();
is.close();
}
os.close();
}
public static void main(String[] args) throws IOException {
mergeFile mf=new mergeFile("E:/mycode/IO_3/dest","E:/mycode/IO_3/destfinal.jpg");
mf.merge();
}
}
需要注意的地方:init()方法处对路径存储容器的初始化:
- 通过路径文件夹名称字符串创建相应的File类对象
- 通过其对象的listFiles()方法得到其子文件数组(数组元素为该目录下所有文件的抽象目录,即File类对象),由该数组长度可以做出循环初始化
- 由之前容器的泛型可知,容器加入的是路径名字符串
- 使用List容器add()方法将绝对路径字符串加入,即add(f.listFiles()[i].getAbsolutePath());