java 实现拷贝_Java实现文件拷贝的4种办法

应用 java 进行文件拷贝 信赖很多人都邑用,,不过效力上是否最好呢?

比来看了看NIO决意试一试 java  NIO 到底有什么机能的提拔.

第一种办法:古老的体式格式

public static long forJava(File f1,File f2) throws Exception{

long time=new Date().getTime();

int length=2097152;

FileInputStream in=new FileInputStream(f1);

FileOutputStream out=new FileOutputStream(f2);

byte[] buffer=new byte[length];

while(true){

int ins=in.read(buffer);

if(ins==-1){

in.close();

out.flush();

out.close();

return new Date().getTime()-time;

}else

out.write(buffer,0,ins);

}

}

办法的2参数分别是原始文件,和拷贝的目标文件.这里不做过多介绍.

实现办法很简单,分别对2个文件构建输入输出流,并且应用一个字节数组作为我们内存的缓存器, 然后应用流从f1 中读出数据到缓存里,在将缓存数据写到f2里面去.这里的缓存是2MB的字节数组

第2种办法:应用NIO中的管道到管道传输

public static long forTransfer(File f1,File f2) throws Exception{

long time=new Date().getTime();

int length=2097152;

FileInputStream in=new FileInputStream(f1);

FileOutputStream out=new FileOutputStream(f2);

FileChannel inC=in.getChannel();

FileChannel outC=out.getChannel();

int i=0;

while(true){

if(inC.position()==inC.size()){

inC.close();

outC.close();

return new Date().getTime()-time;

}

if((inC.size()-inC.position())<20971520)

length=(int)(inC.size()-inC.position());

else

length=20971520;

inC.transferTo(inC.position(),length,outC);

inC.position(inC.position()+length);

i++;

}

}

实现办法:在第一种实现办法根蒂根基上对输入输出流获得其管道,然后分批次的从f1的管道中像f2的管道中输入数据每次输入的数据最大为2MB

办法3:内存文件景象形象写(读文件没有应用文件景象形象,有爱好的可以归去尝尝,,我就不试了,估计会更快)

public static long forImage(File f1,File f2) throws Exception{

long time=new Date().getTime();

int length=2097152;

FileInputStream in=new FileInputStream(f1);

RandomAccessFile out=new RandomAccessFile(f2,"rw");

FileChannel inC=in.getChannel();

MappedByteBuffer outC=null;

MappedByteBuffer inbuffer=null;

byte[] b=new byte[length];

while(true){

if(inC.position()==inC.size()){

inC.close();

outC.force();

out.close();

return new Date().getTime()-time;

}

if((inC.size()-inC.position())

length=(int)(inC.size()-inC.position());

}else{

length=20971520;

}

b=new byte[length];

inbuffer=inC.map(MapMode.READ_ONLY,inC.position(),length);

inbuffer.load();

inbuffer.get(b);

outC=out.getChannel().map(MapMode.READ_WRITE,inC.position(),length);

inC.position(b.length+inC.position());

outC.put(b);

outC.force();

}

}

实现办法:跟伤2个例子不一样,这里写文件流没有应用管道而是应用内存文件映射(假设文件f2在内存中).在轮回中从f1的管道中读取数据到字节数组里,然后在像内存映射的f2文件中写数据.

第4种办法:管道对管道

public static long forChannel(File f1,File f2) throws Exception{

long time=new Date().getTime();

int length=2097152;

FileInputStream in=new FileInputStream(f1);

FileOutputStream out=new FileOutputStream(f2);

FileChannel inC=in.getChannel();

FileChannel outC=out.getChannel();

ByteBuffer b=null;

while(true){

if(inC.position()==inC.size()){

inC.close();

outC.close();

return new Date().getTime()-time;

}

if((inC.size()-inC.position())

length=(int)(inC.size()-inC.position());

}else

length=2097152;

b=ByteBuffer.allocateDirect(length);

inC.read(b);

b.flip();

outC.write(b);

outC.force(false);

}

}

这里实现体式格式与第3种实现体式格式很类似,不过没有应用内存暗射.

下面是对49.3MB的文件进行拷贝的测试时候(毫秒)

Start Copy File...  file size:50290KB

CopyFile:b1.rmvb mode:forChannel  RunTime:3203

CopyFile:b1.rmvb mode:forImage  RunTime:3328

CopyFile:b1.rmvb mode:forJava  RunTime:2172

CopyFile:b1.rmvb mode:forTransfer RunTime:1406

End Copy File!

注:以上文章摘自网络。如有侵权,请联系!一定会在24小时之内删除。。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值