Java中用文件通道(FileChannel)、BufferedInputStream/BufferedOutputStream复制文件对比

在复制大文件时,FileChannel复制文件的速度比BufferedInputStream/BufferedOutputStream复制文件的速度快了近三分之一,体现出FileChannel的速度优势。而且FileChannel是多并发线程安全的。


但是:在复制小文件是,尤其是只有几KB的文件时,FIleChannel方式并不具备优势,反而比流的方式慢得多。

这里附上代码,如下:

public class Test2 {
	
	public static void main(String[] args){
		
		File s = new File("E:\\source.zip");
		File t = new File("F:\\target.zip");
		long start, end;
		
		start = System.currentTimeMillis();
		fileChannelCopy(s,t);//文件通道方式复制
		end = System.currentTimeMillis();
		
		System.out.println("FileChannel复制,用时"+(end - start)+"ms");
		
		start = System.currentTimeMillis();
		fileStreamCopy(s,t);//缓冲输入输出流方式复制
		end = System.currentTimeMillis();
		
		System.out.println("Buffered复制,用时"+(end - start)+"ms");
	}
	
	/**
	 * 使用文件通道(FileChannel)方式复制文件
	 * 
	 * @param s 复制的源文件
	 * @param t 写入的目标文件
	 */
	public static void fileChannelCopy(File s, File t){
		
		FileInputStream fi = null;
		FileOutputStream fo = null;
		
		FileChannel in = null;
		FileChannel out = null;
		
		try{
			fi = new FileInputStream(s);
			fo = new FileOutputStream(t);
			
			in = fi.getChannel();//得到对应的文件通道
			out = fo.getChannel();//得到对应的文件通道
			
			in.transferTo(0, in.size(), out);//连接两个通道,并且从in通道读取,然后写入out通道
		}catch(IOException e){
			e.printStackTrace();
		}finally{
			try{
				fi.close();
				in.close();
				fo.close();
				out.close();
			}catch(IOException e){
				e.printStackTrace();
			}
		}
	} 
	
	/**
	 * 使用输入输出流方式复制文件
	 * 
	 * @param s 复制的源文件
	 * @param t 写入的目标文件
	 */
	public static void fileStreamCopy(File s, File t){
		
		InputStream fis = null;
		OutputStream fos = null;
		try{
			fis = new BufferedInputStream(new FileInputStream(s));
			fos = new BufferedOutputStream(new FileOutputStream(t));
			byte[] buf = new byte[1024];
			int length;
			while((length = fis.read(buf)) != -1){
				fos.write(buf, 0, length);
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			try{
				if(fis != null){
					fis.close();
				}
				if(fos != null){
					fos.close();
				}
			}catch(IOException e){
				e.printStackTrace();
			}
		}
	}
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值