package transit;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.List;
public class SplitFile {
//文件路径
private String FilePath;
//文件名
private String filename;
//文件大小
private long length;
//块数
private int size;
//每块大小
private long blocksize;
//每块名称
private List<String> blockpath;
public SplitFile() {
blockpath=new ArrayList<String>();
}
public SplitFile(String filepath) {
this(filepath,1024);
}
public SplitFile(String filepath,long blocksize) {
this();
this.FilePath=filepath;
this.blocksize=blocksize;
}
/**
*初始化 计算块数,确定文件名
*
*/
public void init() {
File src=null;
//确保健壮性
if(FilePath==null||!((src=new File(FilePath)).exists())) {
return;
}
if(src.isDirectory()) {//文件夹不能分
return;
}
this.filename=src.getName();
//计算块数实际大小与每块大小
this.length=src.length();
//修正大小
if(length<this.blocksize) {
this.blocksize=length;
}
size=(int)Math.ceil(length*1.0/this.blocksize);
}
public void inpathname(String destpath) {
for(int i=0;i<size;i++) {
this.blockpath.add(destpath+"/"+".part"+i);
}
}
/**
* 分割
* @param index
* @param beginpoint
* @param actrualblocksize
* @throws IOException
*/
public void spiltdetail(int index,long beginpoint,long actrualblocksize) throws IOException {
File file=new File(FilePath);//源文件
File file1=new File(blockpath.get(index));//目标
RandomAccessFile rad=null;//输入流
BufferedOutputStream outputStream=null;//输出流
try {
outputStream =new BufferedOutputStream(new FileOutputStream(file1));
rad=new RandomAccessFile(file, "r");
rad.seek(beginpoint);//起始点
byte[] byt=new byte[1024];//暗示写出文件大小
int len;
while((len=rad.read(byt))!=-1) {
if(len-actrualblocksize>0) {
outputStream.write(byt,0,(int)actrualblocksize);
}else {
outputStream.write(byt,0,len);
}
}
rad.close();
outputStream.flush();
outputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
/**
* 文件分割
* @param destpath
* @throws IOException
*/
public void spiltfile(String destpath) throws IOException {
//确定文件路径
inpathname(destpath);
long beginpoint=0;//起始点
long actrualblocksize=blocksize;//每块大小
for(int i=0;i<size;i++) {
if(i==size-1) {
actrualblocksize=this.length-beginpoint;
}
spiltdetail(i, beginpoint, actrualblocksize);
beginpoint+=actrualblocksize;//终点又是起点
}
}
public static void main(String[] args) throws IOException {
SplitFile sc=new SplitFile("G:/filetext/dd/src",90);
sc.init();
sc.spiltfile("G:/filetext");
}
}