Java学习篇之IO流复制方式效率大比拼

  上篇博客将学习到的IO流部分知识进行了梳理,能让读者对期间涉及到的相关流有个大概认识,最后提到了“高效”的问题,口说无凭,下面拿代码验证下,有代码,有真相,重要的是将本文中想要叙述的细节问题全都写在了注释里边,让知识和代码离得更近,求好评!

package 课堂练习;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/*
 * 文件复制方式,一般用的都是字节流,因为
 * 字符流只能对文本文件进行操作,存在局限性
 * 
 * 用字节流进行复制,共有4种方式:
 * 1、字节流     单个字节                         257108ms          最慢的        
 * 2、字节流     字节数组                         404ms  (推荐使用)
 * 3、字节流缓冲区     单个字节              1992ms
 * 4、字节流缓冲区      字节数组              94ms   (推荐使用)          最快的 
 *
 *   用传参数的方式调用(src是源路径,desc是目标路径)
 */
public class Copy {
	public static void main(String[] args) throws IOException {
		//程序开始执行点
		long s = System.currentTimeMillis();
		//分别调用每一种测试方法:
		//copy_1(new File("e:\\360cse.exe"), new File("f:\\360cse.exe"));
		//copy_2(new File("e:\\360cse.exe"), new File("f:\\360cse.exe"));
		//copy_3(new File("e:\\360cse.exe"), new File("f:\\360cse.exe"));
		copy_4(new File("e:\\360cse.exe"), new File("f:\\360cse.exe"));
		//程序结束执行点
		long e = System.currentTimeMillis();
		//计算程序运行完需要的时间(毫秒值)
		System.out.println(e-s);
	}
	//方法一:字节流     单个字节
	public static void copy_1(File src,File desc) throws IOException{
		//建立两个流的对象,绑定数据源和数据目的
		FileInputStream fis=new FileInputStream(src);
		FileOutputStream fos=new FileOutputStream(desc);
		//字节输入流每读取一个字节,输出流就写入一个字节
		int len=0;
		//不等于-1说明还有需要读取的字节
		while((len=fis.read())!=-1){
			fos.write(len);
		}
		//关流操作一般遵循的原则是:先开后关
		fos.close();
		fis.close();
	}
	//方法二:字节流     字节数组
	public static void copy_2(File src,File desc)throws IOException{
		FileInputStream fis=new FileInputStream(src);
		FileOutputStream fos=new FileOutputStream(desc);
		int len=0;
		/*
		 * 用“字节数组”进行读取,和用“字节”读取相比,多了下面这句话,然后
		 * 读取的时候参数就成了3个,分别是定义的字节缓冲数组,0代表从读取的
		 * 第一个字节开始写入,和单个字节读取的方式相比不同的是len代表的含义
		 * 不通,字节读取的方式中,len代表的是字符对应的值,而此处用字节数组
		 * 的方式读取,len代表的是有效个数,请注意区分。		 * 	
		 */
		byte[] bytes=new byte[1024];
		while((len=fis.read(bytes))!=-1){
			fos.write(bytes,0,len);
		}
		fos.close();
		fis.close();
	}
	//方法三: 字节流的缓冲区      单个字节
	public static void copy_3(File src,File desc)throws IOException{
		/*
		 * 创建字节输入流的缓冲流对象,构造方法中包装字节输入流,包装文件
		 * 可以传递任意的字节输入流FileInputStream,传递的是谁,就提高谁的效率
		 * 所以有了此代码,相信读者就可以理解我的上一篇博客中为何把缓冲流当成是“运载火箭”了
		 * 有了它,其他想提速的流就成了“流上之流”了。
		 */	 	
		BufferedInputStream bis=new BufferedInputStream(new FileInputStream(src));
		//道理同上
		BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(desc));
		int len=0;
		while((len=bis.read())!=-1){
			bos.write(len);
		}
		bos.close();
		bis.close();
		
	}
	//方法四:字节流的缓冲流    字节数组
	public static void copy_4(File src,File desc)throws IOException{
		BufferedInputStream bis=new BufferedInputStream(new FileInputStream(src));
		BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(desc));
		int len=0;
		byte[] bytes =new byte[1024];
		while((len=bis.read(bytes))!=-1){
			bos.write(bytes,0,len);
		}
		bos.close();
		bis.close();
	}	
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值