A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 官仁杰 中级黑马   /  2012-10-9 01:11  /  1815 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 官仁杰 于 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,感觉还是对硬盘消耗很大。
总的问题就是,缓冲区的作用到底怎么体现的?
这些代码都是视频里的。

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1

查看全部评分

2 个回复

倒序浏览
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() 方法(可惜字节也没有一行不一行的概念)

                //能想这么多还是好的,我当初看这里就没想这么多,汗呐。。。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
数组不是缓冲区,带有Buffer的类才可以作缓冲区。缓冲区是特定基本类型元素的线性有限序列。除内容外,缓冲区的基本属性还包括容量、限制和位置。
不是一次读写一个到硬盘,而是读写一个到堆内存里。累积了一定数量的数据后才开始写入硬盘,所以无论数组还是缓冲区都减少了对硬盘的访问次数
应该缓冲区的机制优于数组吧

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马