黑马程序员技术交流社区

标题: 字节缓冲流真的缓冲了吗 [打印本页]

作者: 黑马刘杰    时间: 2013-2-27 00:43
标题: 字节缓冲流真的缓冲了吗
本帖最后由 黑马刘杰 于 2013-2-27 10:10 编辑

复习毕老师的IO视频,发现一个问题,如下一个完成文件复制的代码
  1. public static void copy() throws IOException{
  2.                 BufferedInputStream bufis=new BufferedInputStream(new FileInputStream("c:\\3.mp3"));
  3.                 BufferedOutputStream bufos=new BufferedOutputStream(new FileOutputStream("c:\\copy.mp3"));
  4.                
  5.                 int by=0;
  6.                 //这里不还是从文件拿到一个字节到内存
  7.                 while((by=bufis.read())!=-1){
  8.                         //然后将内存中的by字节写入文件?这里没有用到缓存啊
  9.                         bufos.write(by);
  10.                 }
  11.                
  12.                 bufos.close();
  13.                 bufis.close();
  14.                
  15.         }
复制代码
如果把
  1. BufferedInputStream bufis=new BufferedInputStream(new FileInputStream("c:\\3.mp3"));
  2. BufferedOutputStream bufos=new BufferedOutputStream(new FileOutputStream("c:\\copy.mp3"));
复制代码
替换成
  1. FileInputStream fis=new FileInputStream("c:\\3.mp3");
  2.                 FileOutputStream fos=new FileOutputStream("c:\\copy.mp3");
复制代码
是不是效果一样呢?

作者: lzw123451    时间: 2013-2-27 03:54
本帖最后由 李志卫 于 2013-2-27 03:56 编辑

FileInputStream fis=new FileInputStream("c:\\3.mp3");
                FileOutputStream fos=new FileOutputStream("c:\\copy.mp3");

这个是一个一个字节从硬盘上读取没有错。

BufferedInputStream bufis=new BufferedInputStream(new FileInputStream("c:\\3.mp3"));
BufferedOutputStream bufos=new BufferedOutputStream(new FileOutputStream("c:\\copy.mp3"));

而这个,其实它是先从硬盘中读取一段数据(具体最大能读多大我忘记了),而这段数据就在内存中了,然后再用以下方法写入第二个硬盘地址中。
这样在硬件上硬盘就可以直接在一个区域读取一大片,写的时候也是在一个区域写一大片。不用读一个写一个,节约了时间。

       int by=0
           while((by=bufis.read())!=-1){

                        bufos.write(by);



实际上两个方法都是要一个字节一个字节读取的,也要一个字节一个字节写入(这是硬件的固有方式吧),不同的是有缓冲区的可以连续读取—储存—连续写入。
作者: 黑马斯巴达    时间: 2013-2-27 08:37
就像大米饭如果一粒一粒拿会很慢,缓冲区就像饭勺可以一次性拿出一勺。
作者: 黑马刘杰    时间: 2013-2-27 09:15
李志卫 发表于 2013-2-27 03:54
FileInputStream fis=new FileInputStream("c:\\3.mp3");
                FileOutputStream fos=new FileO ...

可是在while循环中,每写入一个字节就要回去再读一次,哪里连续读了?
作者: 吴俊旭    时间: 2013-2-27 09:36
印象中FileOutputStream则是处理小数据模块。而BufferOutputStream是处理大数据模块的,数据量大的时候需要使用Buffer。两种InputStream亦是同理如上。
作者: 黑马刘杰    时间: 2013-2-27 10:08
李志卫 发表于 2013-2-27 03:54
FileInputStream fis=new FileInputStream("c:\\3.mp3");
                FileOutputStream fos=new FileO ...

我明白了,老毕后面的视频也讲到了,谢谢你啊
作者: 何伟    时间: 2013-2-27 20:15
复制小文件可能看不出效果你可以复制大一点的文件,在复制时用System.currentTimeMillis()方法获得当前时间,复制完了再获得当前时间,在想减就可以看出效果
  1.         public static void main(String[] args) throws IOException {
  2.                 long start = System.currentTimeMillis();
  3.                  //把复制文件写成方法在这里掉用
  4.                  //可以把每一种复制方法都试试,
  5.                 long end = System.currentTimeMillis();
  6.                 System.out.println("共耗时:" + (end - start) + "毫秒");
  7.         }
复制代码

作者: 黑马刘杰    时间: 2013-2-27 23:20
何伟 发表于 2013-2-27 20:15
复制小文件可能看不出效果你可以复制大一点的文件,在复制时用System.currentTimeMillis()方法获得当前时间, ...

嗯,谢谢啊
作者: 何伟    时间: 2013-2-27 23:31
黑马刘杰 发表于 2013-2-27 23:20
嗯,谢谢啊

不用客气




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2