java文件按大小分割

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");
}

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值