一、文件切割器
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
public class SplitFileDemo{
private static final int SIZE = 1024*1024;
public static void main(String[] args) throws IOException{
File file = new File("0.mp3" );
splitFile(file);
}
public static void splitFile(File file) throws IOException {
//用读取流关联源文件
FileInputStream fis = new FileInputStream(file);
//定义一个1M的缓冲区
byte[] buf = new byte[SIZE];
//创建目的
FileOutputStream fos = null;
int len = 0;
int count = 1;
//切割文件时,必须记录住被切割文件的名称,以及切割出来碎片文件的个数,以方
便于合并。
//这个信息为了进行描述,使用键值对的方式,用到了properties对象。
Properties prop = new Properties();
File dir = new File("c:\\partFiles" );
if(!dir.exists())
dir.mkdirs();
while((len = fis.read(buf)) != -1){
fos = new FileOutputStream(new File(dir,(count++) +
".part"));
fos.write(buf,0,len);
fos.close();
}
//将被切割文件的信息保存到prop集合中
prop.setProperty( "partcount",count + "" );
prop.setProperty( "filename",file.getName());
fos = new FileOutputStream(new File(dir,count + ".properties" ));
//将prop集合中的数据存储到文件中
prop.store(fos, "save file info");
fis.close();
fos.close();
}
}
二 、文件合并器
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Properties;
public class MergeFile{
public static void main(String[] args) throws IOException {
File dir = new File("c:\\partFiles" );
mergeFile(dir);
}
public static void mergeFile(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 prop = new Properties();
FileInputStream fis = new FileInputStream(confile);
prop.load(fis);
String filename = prop.getProperty( "filename");
int count = Integer.parseInt(prop.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 = 1; x <= partFiles.length; x++){
al.add( new FileInputStream(partFiles[x-1]));
}
final Iterator<FileInputStream> it = al.iterator();
//将多个流合并成一个序列流
Enumeration<FileInputStream> en = Collections.enumeration(al);
SequenceInputStream sis = new SequenceInputStream(en);
FileOutputStream fos = new FileOutputStream(new
File(dir,filename));
byte[] buf = new byte[1024*1024];
int len = 0;
while((len = sis.read(buf)) != -1){
fos.write(buf,0,len);
}
fos.close();
sis.close();
}
}
class SuffixFilter implements FilenameFilter{
private String suffix;
public SuffixFilter(String suffix){
super();
this.suffix = suffix;
}
public boolean accept(File dir,String name){
return name.endsWith(suffix);
}
}