实现对大文件的切割与合并。
按指定个数切(如把一个文件切成10份)或按指定大小切(如每份最大不超过10M)
public class FileSplitEx {
@Test
public void split() throws IOException{
JFileChooser jfc=new JFileChooser();//文件选择框
int iSelBtn=jfc.showOpenDialog(null);
if(iSelBtn==JFileChooser.APPROVE_OPTION){//选择了
//获取用户要切割的文件
File file=jfc.getSelectedFile();
//在切割文件所在文件夹中创建一个"splitFiles"子文件夹,用于存储切割后的碎片
File desDir=new File(file.getParent(),"splitFiles");//ile.getParent()是获取file的路径,这里new的文件的文件名是file+“splitFiles”;
fileSpilit(file,desDir);
}
}
private void fileSpilit(File file, File desDir) throws IOException {//文件分割方法
if(!desDir.exists()){
desDir.mkdir();//创建文件夹
}
FileInputStream fin=new FileInputStream(file);
FileOutputStream fout=null;
byte b[]=new byte[1024*1024];
int len=0;
int count=1;
while((len=fin.read(b))!=-1){
String filename=file.getName()+(count++)+".dar";
fout=new FileOutputStream( new File(desDir,filename) );
fout.write(b,0,len);
fout.close();//一定要关流
}
fin.close();
}
@Test
public void mergeDemo() throws IOException {
//写死了----直接给出了要合并的文件
File srcDir = new File("F:\\QQ文件下载\\hncu\\huncu\\四大名著");
String filename = "四大名著【精校合集】(红+西+水+三).rar";//最后合并得到的文件
mergeFile(srcDir, filename);
}
private void mergeFile(File srcDir, String filename) throws IOException {
if(!srcDir.exists()){
System.out.println("该目录不存在");
return;
}
File[] partFiles=srcDir.listFiles();//将该目录下的所以文件放入partFiles中
if(partFiles.length==0){
System.out.println("该目录下不存在文件");
return;
}
ArrayList<FileInputStream> list=new ArrayList<FileInputStream>();
for(int i=0;i<partFiles.length;i++){
list.add(new FileInputStream( new File(srcDir,filename+(i+1)+".part") ));
}
Enumeration<FileInputStream> en=Collections.enumeration(list);//转成枚举
SequenceInputStream seq=new SequenceInputStream(en);//放入并列流
FileOutputStream fout=new FileOutputStream(new File(srcDir,filename));
byte b[] = new byte[512];
int len=0;
while((len=seq.read(b))!=-1){
fout.write(b, 0, len);
}
fout.close();
seq.close();
}
}