Code Bye

为何FileStream复制文件效率比BufferedStream要高?

 
package day19;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
//BufferedOutputStream
//BufferedInputStream
public class CopyMp3 {
	public static void main(String[] args) {
		long start=System.currentTimeMillis();
		copy0();//非缓冲
		//copy1();//缓冲
		long end=System.currentTimeMillis();
		System.out.println(end-start);

	}
	public static void copy0(){

		FileOutputStream fos=null;
		FileInputStream fis=null;

		try{
			fos=new FileOutputStream("D:\Downloads\黑马_java基础\genymotion-2.2.0-vbox.exe");
			fis=new FileInputStream("D:\KuGou\genymotion-2.2.0-vbox.exe");
			byte[]buf=new byte[8192];
			int len=0;
			while((len=fis.read(buf))!=-1){
				fos.write(buf,0,len);
			}
		}catch(Exception e){
			throw new RuntimeException("cuowu");
		}finally{
			try {
				fis.close();
				fos.close();
			} catch (Exception e2) {
				// TODO: handle exception
			}

		}
	}
	public static void copy1(){
		BufferedInputStream bufi=null;
		BufferedOutputStream bufo=null;



		try{
			bufi=new BufferedInputStream(new FileInputStream("D:\KuGou\genymotion-2.2.0-vbox.exe"));
			bufo=new BufferedOutputStream(new FileOutputStream("D:\Downloads\黑马_java基础\genymotion-2.2.0-vbox.exe"));

			int by=0;
			while((by=bufi.read())!=-1){
				bufo.write(by);
			}
		}catch(Exception e){
			throw new RuntimeException("cuowu");
		}finally{
			try {
				bufi.close();
				bufo.close();
			} catch (Exception e2) {
				// TODO: handle exception
			}

		}

	}
}

代码运行后,copy0()所用时间明显低于copy1()所用时间,求解


40分
1.BufferedStream内部实现就是相当于每次读取8K左右的数据,所以你用FileStream,再用一个8K的buf缓冲效果和BufferedStream差不多。
2.你BufferedStream每次只读一个字节,然而FileStream每次读8K,这样没有可比性,就算是同样用BufferedStream,一个每次读一个字节,一个每次读8K字节,大多数情况下肯定是8K快,你可以试试用FileStream,每次只读一个字节,那就肯定比用BufferedStream每次读一个字节要慢。
3.复制文件不是一定要使用BufferedStream的情况,甚至可以说不应该使用BufferedStream,如果你确切地知道每次要读多少字节,并且这个字节数还是4K的倍数,那么不需要包装一层BufferedStream,而应该直接用FileStream,使用BufferedStream通常是你不知道要读多少字节,或者你知道读多少,但是这个字节数比一个文件Block要小,甚至都不是2的幂,比如你要一个字节一个字节地读文件,这时使用BufferedStream包装一下再去读能提高效率,并且通常BufferedStream只包装文件读取这个区块式文件系统,因为读取一个文件,就算你只需要读一个字节,操作系统和硬件也不可能只读一个字节,因为硬盘文件系统是分块的,通常一个块(也就是上面说的Block)大小是4K,所以如果你要读一个字节,那操作系统要载入4K数据到内存,然后再给你一个字节,然后你读下一个字节,如果操作系统和你的文件流都没有缓冲的话,那又需要重新载入4K数据到内存,然后给你一个字节,所以效率很低,这个时候使用BufferedStream都十分必要了,它能避免反复加载同一个文件块。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明为何FileStream复制文件效率比BufferedStream要高?