问题描述: 有一文件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)
文件拆分后:
三个文件合并后: