package com.aflfte.io2;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
/**
* 面向对象思想封装分割与合并文件
* @author root
*
*/
public class SplitFile {
//源文件
private File src;
//目的地(存放分割后的文件)
private String dir;
//分割后的文件路径
private List<String> paths;
//每块大小
private int blocksize;
//块数:多少块
private int size;
public SplitFile(String src, String dir, int blocksize) {
super();
this.src =new File(src);
this.dir = dir;
this.blocksize = blocksize;
this.paths=new ArrayList<String>();
//初始化
init();
}
private void init() {
//总大小
long len=this.src.length();
//块数
this.size=(int)Math.ceil(len*1.0/blocksize);
//路径
for(int i=0;i<size;i++) {
this.paths.add(this.dir+"/"+i+"-"+this.src.getName());
}
}
/*
* 分割操作
* 1.计算每一块的起始点
* 2.分割
*/
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);
}
}
//第I块的起始位置和实际长度
private void splitDetail(int i,int beginpos,int size) throws IOException {
RandomAccessFile raf=new RandomAccessFile(this.src, "r");
RandomAccessFile raf2=new RandomAccessFile(this.paths.get(i), "rw");
raf.seek(beginpos);
byte[] flush=new byte[1024];
int len=-1;
while((len=raf.read(flush))!=-1) {
if(size>len) {//获取本次读取的所有内容
raf2.write(flush,0,len);
size-=len;
}else {
raf2.write(flush, 0, size);
break;
}
}
raf2.close();
raf.close();
}
public void merge(String path) throws IOException {
//输出流
OutputStream os=new BufferedOutputStream(new FileOutputStream(path));
Vector<InputStream> vi=new Vector<InputStream>();
SequenceInputStream sis=null;
//输入流
for(int i=0;i<paths.size();i++) {
vi.add(new BufferedInputStream(new FileInputStream(paths.get(i))));
}
sis=new SequenceInputStream(vi.elements());
byte[] flush=new byte[1024];
int len=-1;
while((len=sis.read(flush))!=-1) {
os.write(flush,0,len);
}
os.flush();
sis.close();
os.close();
}
public static void main(String[] args) throws IOException {
SplitFile sf=new SplitFile("123.jpg", "dir", 1024);
sf.split();
sf.merge("1.jpg");
}
}
« FileUtils的使用
|
使用随机读取和写入流分割文件»
|