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