Java拷贝文件四种方法

记录一下Java拷贝文件的四种方法:

第一种方法:古老的方式

 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种方法:使用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
++;
        }
    }


方法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){
                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();
        }
    }


第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){
                length
=(int)(inC.size()-inC.position());
            }
else
                length
=2097152;
            b
=ByteBuffer.allocateDirect(length);
            inC.read(b);
            b.flip();
            outC.write(b);
            outC.force(
false);
        }
    }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值