package io.SpiltFile;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/*
* 文件切割器
*
*
*/
public class SpiltFileDemo {
private static final int SIZE=1024*1024;
public static void main(String[] args) throws IOException {
File file=new File("D:\\1.avi");
splitFile_2(file);
}
private static void splitFile_2(File file) throws IOException {//加上配置信息
//用读取流关联源文件
FileInputStream fis=new FileInputStream(file);
//定义一个1M的缓冲区
byte[]buf=new byte[SIZE];
//创建目的:
FileOutputStream fos=null;
int count=1;
int len=0;
/*
* 切割文件时,必须记录住被切割文件的名称,异界切割出来的碎片文件的个数,以方便于合并
* 这个信息为了进行简单的描述,使用键值对的方式 用到了properties对象
*
*/
Properties prop=new Properties();
File dir=new File("d:\\partfiles");
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();
}
fos=new FileOutputStream(new File(dir,count+".properties"));
//将被切割文件的信息保存到prop集合中。
prop.setProperty("partcount",count+"");
prop.setProperty("filename",file.getName());
//将prop集合中的数据存储到问文件中。
prop.store(fos, "save file info");
fos.close();
fis.close();
}
public static void splitFile(File file) throws IOException {//不加配置信息
//用读取流关联源文件
FileInputStream fis=new FileInputStream(file);
//定义一个1M的缓冲区
byte[]buf=new byte[SIZE];
//创建目的:
FileOutputStream fos=null;
int count=1;
int len=0;
File dir=new File("d:\\partfiles");
if(!(dir.exists())) {
dir.mkdir();
}
while((len=fis.read(buf))!=-1) {
fos=new FileOutputStream(new File(dir,(count++)+".xixi"));
fos.write(buf, 0, len);
}
fos.close();
fis.close();
}
}
package io.SpiltFile;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
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.GregorianCalendar;
import java.util.Properties;
public class MergeFile {//合并被切割文件
public static void main(String[] args) throws IOException {
File dir=new File("d:\\partfiles");
mergeFile_2(dir);
}
private 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 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<=count-1;x++) {
al.add(new FileInputStream(new File(dir,x+".part")));
}
//将多个流合并成一个序列流
Enumeration<FileInputStream> en=Collections.enumeration(al);//将al集合中的枚举 赋值给 en
SequenceInputStream sis=new SequenceInputStream(en);//en中的 多个流合并成一个
FileOutputStream fos=new FileOutputStream(new File(dir,filename));
//定义一个1M的缓冲区
byte[]buf=new byte[1024];
int len=0;
while((len=sis.read(buf))!=-1) {
fos.write(buf, 0, len);
}
fos.close();
sis.close();
}
public static void mergeFile(File dir) throws IOException {
ArrayList<FileInputStream> al=new ArrayList<FileInputStream>();
for(int x=1;x<=11;x++) {
al.add(new FileInputStream(new File(dir,x+".xixi")));
}
Enumeration<FileInputStream> en=Collections.enumeration(al);//将al集合中的枚举 赋值给 en
SequenceInputStream sis=new SequenceInputStream(en);//en中的 多个流合并成一个
FileOutputStream fos=new FileOutputStream(new File(dir,"a.avi"));
byte[]buf=new byte[1024];
int len=0;
while((len=sis.read(buf))!=-1) {
fos.write(buf, 0, len);
}
fos.close();
sis.close();
}
}
package io.SpiltFile;
/*
* 过滤器
*/
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);
}
}