文件的分割与合并其本质还是利用IO流来进行操作
以下实例代码中我用到了自己写的关闭流的工具类:
1:CloseUtil类实例代码:
import java.io.Closeable;
import java.io.IOException;
public class CloseUtil {
public static void close(Closeable ... io) {
for(Closeable temp:io) {
if(null!=temp) {
try {
temp.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//使用泛型方法
public static <T extends Closeable> void closeAll(T ... io){
for(Closeable temp:io) {
if(null!=temp) {
try {
temp.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
2:文件的分割与合并实例:
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.RandomAccessFile;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
public class SplitFile {
//文件的路径
private String filePath;
//文件名
private String fileName;
//文件的大小
private long length;
//块数
private int size;
//每块的大小
private long blockSize;
//分割后的存放目录
private String destBlockPath;
//每块的名称
private List<String> blockPath;
public SplitFile() {
blockPath = new ArrayList<String>();
}
public SplitFile(String filePath,String destBlockPath) {
this(filePath,destBlockPath,1024);
}
public SplitFile(String filePath,String destBlockPath,long blockSize) {
this();
this.filePath=filePath;
this.blockSize=blockSize;
this.destBlockPath=destBlockPath;
init();
}
/**
* 初始化操作 计算 块数、确定文件名
*/
public void init() {
//增加程序的健壮性
File src =null;
if(null==filePath || !(((src=new File(filePath)).exists()))){
return;
}
if(src.isDirectory()) {
return;
}
//文件名
this.fileName=src.getName();
//计算块数 实际大小 与每块大小
this.length=src.length();
//修正 每块 大小
if(this.blockSize > length) {
this.blockSize = length;
}
//确定块数
size = (int)Math.ceil(length*1.0/this.blockSize);
//确定文件路径
initPathName();
}
private void initPathName() {
for(int i=0;i<size;i++) {
this.blockPath.add(destBlockPath+"/"+this.fileName+".part"+i);
}
}
/**
* 文件分割
* @param destPath 分割文件存放目录
* 1、第几块
* 2、起始位置
* 3、分割大小
*/
public void split() {
long beginPos = 0;//起始点
long actualBlockSize=blockSize;//实际大小
//计算所有块的大小、位置、索引
for(int i=0;i<size;i++) {
if(i==size-1) {//最后一块
actualBlockSize=this.length-beginPos;
}
splitDetial(i,beginPos,actualBlockSize);
beginPos+=actualBlockSize;//本次的终点就是下一次的起点
}
}
/**
* 文件的具体分割 输入 输出
* 文件拷贝
* @param idx 第几块
* @param beginPos 起始点
* @param autalBlockSize 实际大小
*/
private void splitDetial(int idx,long beginPos,long autalBlockSize) {
//1.创建源
File src = new File(this.filePath);//源文件
File dest= new File(this.blockPath.get(idx));//目标文件
//2.选择流
RandomAccessFile raf= null;//输入流
BufferedOutputStream bos = null;//输出流
try {
raf = new RandomAccessFile(src,"r");
bos = new BufferedOutputStream(new FileOutputStream(dest));
//读取文件
raf.seek(beginPos);
//缓冲区
byte[] flush = new byte[1024];
int len =0;
while(-1!=(len=raf.read(flush))) {
//写出
if(autalBlockSize-len>0) {//查看是否够减
bos.write(flush,0,len);
autalBlockSize-=len;//剩余量
}else {//写出最后一次的剩余量
bos.write(flush,0,(int)autalBlockSize);
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
CloseUtil.close(bos,raf);
}
}
/**
* 文件的合并
* @param args
*/
public void merge(String destPath) {
//1、创建源
File dest = new File(destPath);
//2、选择流
BufferedOutputStream bos = null;
SequenceInputStream sis = null;
//创建容器
Vector<InputStream> vi = new Vector<InputStream>();
try {
for(int i=0;i<this.blockPath.size();i++) {
vi.add(new BufferedInputStream(new FileInputStream(new File(this.blockPath.get(i)))));
}
bos = new BufferedOutputStream(new FileOutputStream(dest,true)); //追加
sis = new SequenceInputStream(vi.elements());
byte[] flush = new byte[1024];
int len = 0;
while(-1!=(len=sis.read(flush))) {
bos.write(flush,0,len);
}
bos.flush();
CloseUtil.close(sis);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
CloseUtil.closeAll(bos);
}
}
public static void main(String[] args) {
SplitFile sf = new SplitFile("E:/aa/bb/test/Demo03.java","E:/aa/bb/test",300);
System.out.println(sf.size);
//sf.split();
sf.merge("E:/aa/bb/test/merge.txt");
}
}