IO流不同方法copy文件的效率分析

本文分析了IO流复制文件的三种方法:直接使用FileInputStream和FileOutputStream,使用BufferedInputStream和BufferedOutputStream,以及自定义byte[]缓冲区。测试结果显示,逐字节读取效率最低,而自定义缓冲区的方法在适当调整缓冲区大小后,性能优于内置缓冲区,成为最佳选择。
摘要由CSDN通过智能技术生成

IO流copy文件的几种方法介绍

1、FileInputStream和FileOutputStream:文件的读写一般是以字节为单位的,前者从文件中获取字节数据,后者将字节数据写入文件。这种方式获取的对象对于数据的读写是逐字节的,稍后我们将测试其读写的速度。在读写的过程中我们可以这样理解,read()方法查看其底层可以发现是一个native方法,native方法连接了java和底层的C语言,IO流读取到了数据,保存在一个8位(一个字节)的寄存器中,最简单的文件流就是对这个寄存器上的数据进行操作的,这也是为什么这种方法是逐字节读写的原因,这种方式在每次读完一个字节的的时候,就会产生溢出中断,CPU再去响应中断请求,这样一来,其效率是很低下的,在读大文件的时候,这种方法就捉襟见肘了。
2、BufferedInputStream和BufferedOutputStream:缓冲输入流和缓冲输出流,怎么获得缓冲流对象呢?我们通过把方法1中的对象用缓冲流的构造方法包装即可获得。那么什么是缓冲呢?JVM内存中为它开辟了一块区域,用来临时存放数据,相当于是在方法1中加了一块区域,读到的字节都会经过这个中间环节,先写到缓冲区,当缓冲区读满或者给其相应强制清除缓冲的指令(flush方法)时,就会一次性读取缓冲区的所有数据。它的优越之处显而易见,CPU可以有更多的时间去处理别的事务了,一次性地读取大大提升了读取的速度,程序在性能上明显优于方法1,我们在之后的测试中也可以看到。
3、自定义byte[] buf字节数组创建缓冲区:和方法2的原理类似,但这种方法使得我们对数据的处理更加有可操作性,我们可以自己定义缓冲区的大小,因为这个空间是我们自己定义的。在流程上,我们先把数据写入数组,获取长度,再把字节数组的数据写到文件中,这依然是一种批量操作。

测试三种方法copy文件的速度(java程序)

1、代码实现:我这里分别写了三个方法,测试程序传文件所花费的时间,第三种方法修改入口参数,可以自定义缓冲区字节数组的长度。

public class Test {
   
	 public static void main(String[] args){
   
		 Test test = new Test();
		 test.withoutBuffer();//测试不加缓冲
		 test.addBuffer(); //测试加缓冲
		 test.BufferByte(1024);//自定义缓冲数组长度		 
	 }
	/**
	 * 不加缓冲的文件传输测试
	 */
	public void withoutBuffer(){
   
		File file = new File("E:\\workspace\\mayifan\\src\\com\\myf\\bufferInputStream1211\\send\\云计算必读-Google_三大论文中文版.pdf");
		File file1 = new File("E:\\workspace\\mayifan\\src\\com\\myf\\bufferInputStream1211\\get\\云计算必读-Google_三大论文中文版.pdf");
		try{
   
		FileInputStream fis = new FileInputStream(file
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值