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