黑马程序员技术交流社区

标题: BufferedReader缓冲区 [打印本页]

作者: 冯晓骏    时间: 2013-10-23 20:27
标题: BufferedReader缓冲区
BufferedReader缓冲区与Reader的read(char[])方法有什么区别,还是缓冲区就是用这个方法实现的,只不过读的多了些,刚刚看了一眼源码,什么len,MARK的,没太看懂,希望有同样疑惑的同学把想法拿出来交流一下
作者: 完美恋爱    时间: 2013-10-23 20:36
输入字符流:Reader: 字符读取流的抽象类
                                |--->FileReader:
                                                        字符读取流
                                        |--->LineNumberReader:
                                                                跟踪行号的缓冲字符读取流
                                |--->BufferedReader:
                                                        字符读取流缓冲区
                                |--->InputStreamReader:
                                                        字节通向字符的转换流(涉及键盘录入时用)
作者: Stephen_Chow    时间: 2013-10-23 20:53
       有区别的,BufferedReader缓冲区可以方便的读一行(readLine()),字符读取流最方便的就是读取一行。              而Reader的read(char[])方法,是一次读取指定数组长度的数据。所以是不一样的。
      readline的原理:无论读一行,还是读多个数据,其实最终嗾使在硬盘上一个一个的读取。所以最终使用的是read()方法一次一个的读。认真读下面的代码,你就会明白了
      具体可参考毕——传智播客毕向东Java基础视频教程-day19-05-IO流(MyBufferedReader)。


  1. /*
  2. 明白了BufferedReader类中特有方法readLine的原理后,
  3. 可以自定义一个类中包含一个功能和readLine一致的方法。
  4. 来模拟一下BufferedReader
  5. */
  6. import java.io.*;
  7. class MyBufferedReader extends Reader
  8. {
  9.        
  10.         private Reader r;
  11.         MyBufferedReader(Reader r)
  12.         {
  13.                 this.r = r;
  14.         }

  15.         //可以一次读一行数据的方法。
  16.         public String myReadLine()throws IOException
  17.         {
  18.                 //定义一个临时容器。原BufferReader封装的是字符数组。
  19.                 //为了演示方便。定义一个StringBuilder容器。因为最终还是要将数据变成字符串。
  20.                 StringBuilder sb = new StringBuilder();
  21.                 int ch = 0;
  22.                 while((ch=r.read())!=-1)
  23.                 {
  24.                         if(ch=='\r')
  25.                                 continue;
  26.                         if(ch=='\n')
  27.                                 return sb.toString();
  28.                         else
  29.                                 sb.append((char)ch);
  30.                 }

  31.                 if(sb.length()!=0)
  32.                         return sb.toString();
  33.                 return null;               
  34.         }

  35.         /*
  36.         覆盖Reader类中的抽象方法。

  37.         */
  38.         public int read(char[] cbuf, int off, int len) throws IOException
  39.         {
  40.                 return r.read(cbuf,off,len) ;
  41.         }

  42.         public void close()throws IOException
  43.         {
  44.                 r.close();
  45.         }
  46.         public void myClose()throws IOException
  47.         {
  48.                 r.close();
  49.         }
  50. }


  51. class  MyBufferedReaderDemo
  52. {
  53.         public static void main(String[] args) throws IOException
  54.         {
  55.                 FileReader fr = new FileReader("buf.txt");

  56.                 MyBufferedReader myBuf = new MyBufferedReader(fr);

  57.                 String line = null;

  58.                 while((line=myBuf.myReadLine())!=null)
  59.                 {
  60.                         System.out.println(line);
  61.                 }

  62.                 myBuf.myClose();
  63.         }
  64. }
复制代码

作者: 乔兵    时间: 2013-10-25 08:18
楼主你好,如果问题已解决请将帖子状态修改为提问结束,

如果未解决请继续提问,谢谢合作

修改方法请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html
作者: 冯晓骏    时间: 2013-10-25 14:01
Stephen_Chow 发表于 2013-10-23 20:53
有区别的,BufferedReader缓冲区可以方便的读一行(readLine()),字符读取流最方便的就是读取一行。  ...

那么所谓缓冲区怎么提高了效率呢,照你说的磁头的擦写次数肯定是一样多的,那么是减少了与底层硬盘的通信次数么?
作者: 枫儿    时间: 2013-10-25 16:00
可以多看几遍视频




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