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都十分必要了,它能避免反复加载同一个文件块。 |