package cn.hncu.inOut.io2;
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 javax.swing.JFileChooser;
public class FileSplitDemo {
public static void main(String[] args) throws IOException{
//“打开文件”对话框的使用
JFileChooser jfc = new JFileChooser();
int result = jfc.showOpenDialog(null);
File file =null;
File desDir =null;
//1切割
if(result==JFileChooser.APPROVE_OPTION){
//切割文件
file = jfc.getSelectedFile();//用户所选择的文件
//System.out.println(file.getName());
desDir = new File(file.getParent(),"splitFiles");
System.out.println(desDir.getAbsolutePath());
fileSplit(file,desDir);
//2合并(运行时,直接对刚才切割的那些文件碎片进行合并)
String fileName = file.getName();
mergeFile(desDir,fileName);
}
}
private static void fileSplit(File srcFile, File desDir) throws IOException {
//1源
FileInputStream fis = new FileInputStream(srcFile);
//2目的
//文件io流操作的健壮性防护(用File对象去开道)
if(!desDir.exists()){
desDir.mkdirs();
}
//切割
FileOutputStream fos = null;
byte buf[] = new byte[1024*1024];
int len=0;
int count=1;
while( (len=fis.read(buf))!=-1 ){
String fileName = srcFile.getName()+(count++)+".part";
fos = new FileOutputStream( new File(desDir,fileName) );
fos.write(buf,0,len);
fos.close();
}
}
private static void mergeFile(File srcDir, String fileName) throws IOException {
//健壮性防护(用File对象去开道)
if(!srcDir.exists()){
throw new RuntimeException(srcDir.getName()+"不存在");
}
File partFiles[] = srcDir.listFiles();
//测试:输出碎片的文件名
// for(File f:partFiles){
// System.out.println(f.getName());
// }
if(partFiles.length==0){
throw new RuntimeException("碎片不存在!");
}
//用序列流进行文件合并
ArrayList<FileInputStream> aList = new ArrayList<FileInputStream>();
for(int i=0;i<partFiles.length;i++){
aList.add(new FileInputStream( new File(srcDir,fileName+(i+1)+".part")) );
}
//枚举接口对象
Enumeration<FileInputStream> en = Collections.enumeration(aList);
SequenceInputStream sis = new SequenceInputStream(en);
//把序列流当中的内容写到一个新文件(合并后的文件)
FileOutputStream fos = new FileOutputStream(new File(srcDir,fileName));
byte buf[] = new byte[1024];
int len=0;
while( (len=sis.read(buf))!=-1){
fos.write(buf,0,len);
}
fos.close();
sis.close();
}
}
文件的切割和合并
最新推荐文章于 2024-11-08 23:31:31 发布