package cn.itcast.io.split;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Properties;
public class MergeFile {
public static void main(String[] args) throws IOException {
mergeFile_2(new File("e:\\filepart"));
}
/**
* 需求:完成对碎片文件的合并
* @param dir
* @throws IOException
*/
public static void mergeFile_2(File dir) throws IOException {
/*
* 获取指定目录下的配置文件对象
*
*/
File[] files=dir.listFiles(new SuffixFilter(".properties"));
if(files.length!=1)
throw new RuntimeException(dir+"该目录下没有.properties文件或者该文件不唯一");
//记录配置的文件对象
File confile=files[0];
//获取该文件中的信息
Properties pro=new Properties();
FileInputStream fis=new FileInputStream(confile);
pro.load(fis);
String filename=pro.getProperty("filename");
int count=Integer.parseInt(pro.getProperty("partcount"));
//获取该目录下的所有碎片文件
File[] partFiles=dir.listFiles(new SuffixFilter(".part"));
if(partFiles.length!=(count-1))
throw new RuntimeException("碎片文件个数不符合要求,应该是"+count+"个");
//将碎片文件和流对象关联,并存储到集合中
ArrayList<FileInputStream> al=new ArrayList<FileInputStream>();
for(int x=0;x<partFiles.length;x++){
al.add(new FileInputStream(partFiles[x]));
}
//将多个流合并成一个序列流
Enumeration<FileInputStream> en=Collections.enumeration(al);
SequenceInputStream sis=new SequenceInputStream(en);
FileOutputStream fos=new FileOutputStream(new File(dir,filename));
byte[] buf=new byte[1024];
int len=0;
while((len=sis.read(buf))!=-1){
fos.write(buf, 0, len);
}
sis.close();
fos.close();
}
public static void mergeFile_1(File dir) throws IOException{
ArrayList<FileInputStream> al=new ArrayList<FileInputStream>();
for(int x=1;x<=9;x++){
al.add(new FileInputStream(new File(dir,x+".part")));
}
Enumeration<FileInputStream> en=Collections.enumeration(al);
SequenceInputStream sis=new SequenceInputStream(en);
FileOutputStream fos=new FileOutputStream("e:\\1.mp3");
byte[] buf=new byte[1024];
int len=0;
while((len=sis.read(buf))!=-1){
fos.write(buf, 0, len);
}
sis.close();
fos.close();
}
}
package cn.itcast.io.split;
import java.io.File;
import java.io.FilenameFilter;
public class SuffixFilter implements FilenameFilter {
private String suffix;
public SuffixFilter(String suffix) {
super();
this.suffix = suffix;
}
@Override
public boolean accept(File dir, String name) {
return name.endsWith(suffix);
}
}
转载于:https://my.oschina.net/u/2422152/blog/483761