java中文件的分割与合并

文件的分割与合并其本质还是利用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");
	}
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值