java: io操作---文件按数量拆分, 再依次合并为原文件

                      问题描述: 有一文件A, 为保证机密性,                                                               

需要把它拆分为三份, 独立保存,到某天再和而为一,如何做?                                              

 (  拆2份再合并,  拆n份再合并, 与此类似,不再一一列举 )                                                    

 

 下面是具体实现: 拆3份再合并的思路  +  代码:                                                                      

                             1,使用IO缓冲流,提升读写效率;                                                                

                              2,使用jdk7的新特性, try(..变量声明...){...},自动管理流的关闭)             

/**
 * 文件拆分:  文件A--->a1.part +a2.part +a3.part
 * 文件合並:  a1.part +a2.part +a3.part---->文件A
 * 
 * 拆分思路:  一個流读文件A --->交叉写入三个地方: a1.part +a2.part +a3.part
 * 合并思路:  三个流读文件----->交叉写入同一个地方: a1.part +a2.part +a3.part--->文件A
 * 
 * @author wang
 *
 */
public class Copy {
	
	//=============拆分文件: 文件A-->a1.part + a2.part=========
	static void copy(String from,String to1,String to2,String to3) {
		//创建流
		byte[] bs=new byte[1024];
		try(	FileInputStream in=new FileInputStream(new File(from));//流自动关闭
			BufferedOutputStream  out1=	new BufferedOutputStream (new FileOutputStream(new File(to1)) );
			BufferedOutputStream  out2=	new BufferedOutputStream (new FileOutputStream(new File(to2)) );
			BufferedOutputStream  out3=	new BufferedOutputStream (new FileOutputStream(new File(to3)) );
		) {
			//输入流读--》交叉写: a1.part+ a2.part+ a3.part
			int len=0;
			boolean flag1=true;
			boolean flag2=false;
			boolean flag3=false;
			
			while((len=in.read(bs))!=-1) {
				
				if(flag1) {		//第一次: out1写
        				out1.write(bs, 0, len);
					flag1=false;
					flag2=true;
					flag3=false;
					
				}else if(flag2) {//第二次: out2写
					out2.write(bs, 0, len);
					flag1=false;
					flag2=false;
					flag3=true;
					
				}else if(flag3){//第三次: out3写
					out3.write(bs, 0, len);
					flag1=true;
					flag2=false;
					flag3=false;
				}
			}
			System.out.println("ok.....");
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e1) {
			e1.printStackTrace();
		}
	}
	
	
	//============合并文件: a1.part + a2.part + a3.part --->文件A==========
	static void back(String from1,String from2,String from3,String to) {
		//创建流
		byte[] bs1=new byte[1024];
		byte[] bs2=new byte[1024];
		byte[] bs3=new byte[1024];
		
		try(	BufferedOutputStream out=new BufferedOutputStream(new FileOutputStream( new File(to) ));//流自动关闭
			BufferedInputStream in1=new BufferedInputStream(new FileInputStream(new File(from1) ));
			BufferedInputStream in2=new BufferedInputStream(new FileInputStream(new File(from2) ));
			BufferedInputStream in3=new BufferedInputStream(new FileInputStream(new File(from3) ));
		) {
			//三个流交叉读-----》写入同一个流: a1.part + a2.part +a3.part==>文件A
			int len1=0,len2=0,len3=0;
			
			while((len1=in1.read(bs1) )!=-1 ) {//第一个流读文件--马上写入
				out.write(bs1, 0, len1);
			
				if((len2=in2.read(bs2))!=-1) {//第二个流:读文件---马上写入
					out.write(bs2,0,len2);
						
					if((len3=in3.read(bs3))!=-1) {//第三个流:读文件---马上写入
						out.write(bs3,0,len3);
					}
				}
	        	}
	    	    System.out.println("ok.....");
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e1) {
			e1.printStackTrace();
		}
	}
}
public class CopyTest {
        //测试"三分天下,合而为一": 验证结果
	public static void main(String[] args) {
		//文件A: -->a1.part + a2.part + a3.part
		copy("a.ppt","/home/wang/a1.part","/home/wang/a2.part","/home/wang/a3.part");
		//还原A:    a1.part + a2.part +a3.part-->文件A
		back("/home/wang/a1.part","/home/wang/a2.part","/home/wang/a3.part","/home/wang/back.ppt");
	}
}

执行之前:源文件(a.ppt)

文件拆分后:

三个文件合并后:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

根哥的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值