【JAVA】IO之实现文件分割

package chj.io1;
/**
 * 文件分割
 */
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.List;

public class SplitFile {
	//源头
	private File src;
	//目的地(文件夹)
	private String destDir;
	//分割后的文件路径
	private List<String> destPaths;
	//每块大小
	private int blockSize;
	//块数:多少块
	private int size;
	
	public SplitFile(String srcPath,String destDir,int blockSize) {
		this.src=new File(srcPath);
		this.destDir=destDir;
		this.blockSize=blockSize;
		this.destPaths=new ArrayList<String>();
		
		init();
	}
	
	private void init() {
		//总长度
		long len=this.src.length();
		
		//块数
		this.size=(int) Math.ceil(len*1.0/this.blockSize);
		
		//路径
		for(int i=0;i<size;i++) {
			this.destPaths.add(this.destDir+"/"+i+"-"+this.src.getName());
		}
	}
	
	/**
	 * 分割
	 * 1、计算每一块的起始位置和实际大小
	 * @throws IOException 
	 */
	public void split() throws IOException {
		//总长度
		long len=src.length();
		
		int beginPos=0;
		int actualSize=(int)(blockSize>len?len:blockSize);
		for (int i = 0; i <size; i++) {
			beginPos=i*blockSize;
			if(i==size-1) {//最后一块
				actualSize=(int)len;
			}else {
				actualSize=blockSize;
				len-=actualSize;//剩余量
			}
			splitDetail(i,beginPos,actualSize);
		}		
	}
	
	//指定起始位置,读取指定长度(实际大小)
	public  void splitDetail(int i,int beginPos,int actualSize) throws IOException{
		RandomAccessFile raf=new RandomAccessFile(this.src,"r");//有"r" "rw" "rws" "rwd"
		RandomAccessFile raf2=new RandomAccessFile(this.destPaths.get(i),"rw");
		raf.seek(beginPos);
		
		byte[] flush=new byte[1024];
		int len=-1;
		while((len=raf.read(flush))!=-1) {
			if(actualSize>len) {//获取本次读取的所有内容
				raf2.write(flush,0,len);
				actualSize-=len;
			}else {
				raf2.write(flush,0,actualSize);
				break;
			}
			
		}
		raf2.close();
		raf.close();
		
	}
	
	public static void main(String[] args) {//调用
		SplitFile sf=new SplitFile("girl.png", "dest",1024*100);
		try {
			sf.split();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值