黑马程序员技术交流社区

标题: 关于io流的缓冲区的问题 [打印本页]

作者: 官仁杰    时间: 2012-10-9 01:11
标题: 关于io流的缓冲区的问题
本帖最后由 官仁杰 于 2012-10-9 17:50 编辑
  1. FileReader  fr = new FileReader("DateDemo.java");

  2.                 char[] buf = new  char[1024];

  3.                 int num = 0;

  4.                 while((num=fr.read(buf))!=-1)
  5.                 {
  6.                         System.out.print(new String(buf,0,num));
  7.                 }

  8.                 fr.close();
复制代码
这样写感觉是不是和用BufferedReader效果差不多?(用char数组做了缓冲区)
=================================================================
  1. public static void copy_1()throws IOException
  2.         {
  3.                 BufferedInputStream bufis = new BufferedInputStream(new FileInputStream("c:\\0.mp3"));
  4.                 BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("c:\\1.mp3"));
  5.                
  6.                 int by = 0;

  7.                 while((by=bufis.read())!=-1)
  8.                 {
  9.                         bufos.write(by);
  10.                 }

  11.                 bufos.close();
  12.                 bufis.close();

  13.                
  14.         }
复制代码
这段代码中,用了缓冲区,但是从代码上看,是一次读写一个int,感觉还是对硬盘消耗很大。
总的问题就是,缓冲区的作用到底怎么体现的?
这些代码都是视频里的。
作者: 孙含庆    时间: 2012-10-9 01:59
FileReader  fr = new FileReader("DateDemo.java");

                char[] buf = new  char[1024];

                int num = 0;

                while((num=fr.read(buf))!=-1) //这里read 方法还是背地里一个一个的读,每读一次就执行一次IO操作,
                                                                                                
                                 //操作一次就访问一下硬盘,硬盘累呀

                {
                        System.out.print(new String(buf,0,num));

                }
                fr.close();

public static void copy_1()throws IOException
        {

                BufferedInputStream bufis = new BufferedInputStream(new FileInputStream("c:\\0.mp3"));

                BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("c:\\1.mp3"));
               
                int by = 0;

                while((by=bufis.read())!=-1) //而缓冲区的read 方法,因为在BufferReader 内部会创建缓冲区,
                                                                        
                                        //他会一下将数据读入到自己的缓冲区,然后你调用read 方法时,就不用再去读硬盘,直接在内存中
                              //给你传递数据,极大的提高了数据处理速度。 建议在参考下API文档
                {

                        bufos.write(by);
                }

                bufos.close();

                bufis.close();               
        }
                //一下子就是感觉用不用BufferedInputStream 还是要自己去创建字符数组,他就像是个多余似的。

                //可是不创建自己的缓冲区数组,就拿不到数据。

                //他还不如 BufferedReader 有一个读一行的readLine() 方法(可惜字节也没有一行不一行的概念)

                //能想这么多还是好的,我当初看这里就没想这么多,汗呐。。。
作者: 王梁星    时间: 2012-10-9 11:45
数组不是缓冲区,带有Buffer的类才可以作缓冲区。缓冲区是特定基本类型元素的线性有限序列。除内容外,缓冲区的基本属性还包括容量、限制和位置。
不是一次读写一个到硬盘,而是读写一个到堆内存里。累积了一定数量的数据后才开始写入硬盘,所以无论数组还是缓冲区都减少了对硬盘的访问次数
应该缓冲区的机制优于数组吧




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