文件切割
/**
* 文件切割器
* @throws IOException
*/
public static void splitFile(File file) throws IOException{
//用读取流关联源文件
FileInputStream fis = new FileInputStream(file);
//定义一个1M的缓冲区
byte[] buf = new byte[SIZE];//1M
//创建目的
FileOutputStream fos = null;
int len = 0;
int count = 1;
File dir = new File("F:/");
if(!(dir.exists())){
dir.mkdir();
}
while((len=fis.read(buf))!=-1){
fos = new FileOutputStream(new File(dir,(count++)+".part"));
fos.write(buf,0,len);
}
}
文件合并
/**
* 合并文件
*/
public static void mergeFile(File dir) throws FileNotFoundException,IOException{
ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
for(int i=1;i<=3;i++){
al.add(new FileInputStream(new File(dir,i+".part")));
}
//获取enumeration
Enumeration<FileInputStream> en = Collections.enumeration(al);
SequenceInputStream sis = new SequenceInputStream(en);
FileOutputStream fos = new FileOutputStream(new File(dir+"meige.txt"));
byte[] buf = new byte[1024];
int len = 0;
while((len=sis.read(buf))!=-1){
fos.write(buf,0,len);
}
fos.close();
}
文件切割合并+配置文件
class properameFilter implements FilenameFilter{
private String name;
properameFilter(String name){
this.name = name;
}
@Override
public boolean accept(File dir, String name) {
// TODO Auto-generated method stub
return name.endsWith(this.name);
}
}
public static void splitFile_2(File file) throws FileNotFoundException,IOException{
/**
* 切割文件时,必须要记录住被切割文件的名称,以及切割出来碎片文件的个数,以便于合并。
* 这个信息为了进行简单的描述,所有使用键值对方式,用到了properties对象。
*/
//用读取流关联源文件
FileInputStream fis = new FileInputStream(file);
//定义一个1M的缓冲区
byte[] buf = new byte[SIZE];//1M
//创建目的
FileOutputStream fos = null;
Properties prop = new Properties();//配置文件
int len = 0;
int count = 1;
File dir = new File("F:/file/");
if(!(dir.exists())){
dir.mkdir();
}
while((len=fis.read(buf))!=-1){
fos = new FileOutputStream(new File(dir,(count++)+".part"));
fos.write(buf,0,len);
fos.close();
}
//将被切割文件信息保存到properties集和中
prop.setProperty("filenaem",file.getName());
prop.setProperty("partcount", count+"");
//将properties中数据存储到文件中
fos = new FileOutputStream(new File(dir,"info"+".properties"));
prop.store(fos, "save file info");
fos.close();
fis.close();
}
public static void mergeFile_2(File dir) throws IOException{
File[] files_prop = dir.listFiles(new properameFilter(".properties"));
if(files_prop.length!=1){
throw new RuntimeException(dir+",没有配置文件");
}
Properties prop = new Properties();
//需要使用读取流
FileInputStream fis = new FileInputStream(new File(dir,files_prop[0].getName()));
//使用load方法
prop.load(fis);
String count_str = prop.getProperty("partcount");
int count = Integer.parseInt(count_str);
String filename = prop.getProperty("filenaem");
File[] files = dir.listFiles(new properameFilter(".part"));
if(files.length!=(count-1)){
throw new RuntimeException("碎片个数不对,应该是:"+count+"个");
}
ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
for(int i=1;i<count;i++){
al.add(new FileInputStream(files[i-1]));
}
//获取enumeration
Enumeration<FileInputStream> en = Collections.enumeration(al);
SequenceInputStream sis = new SequenceInputStream(en);
FileOutputStream fos = new FileOutputStream(new File(dir+"meige.txt"));
byte[] buf = new byte[1024];
int len = 0;
while((len=sis.read(buf))!=-1){
fos.write(buf,0,len);
}
fos.close();
}