黑马程序员技术交流社区

标题: 关于BufferedReader中的readLine()的问题 [打印本页]

作者: 途遥子若    时间: 2014-1-4 15:03
标题: 关于BufferedReader中的readLine()的问题


  1. while((line=bufr.readLine())!=null)
  2. {
  3.   bufrw.write(line);
  4.   bufw.newLine();
  5.   bufw.flush();
  6. }
复制代码
为什么说“readLine()方法返回的时候只返回回车符之前的数据内容”?



作者: 776699    时间: 2014-1-4 15:54
因为 BufferedReader底层封装了,read()方法,读到\r\n后,就会返回 将缓冲区中的 字符串toString返回。
作者: 途遥子若    时间: 2014-1-4 16:08
776699 发表于 2014-1-4 15:54
因为 BufferedReader底层封装了,read()方法,读到\r\n后,就会返回 将缓冲区中的 字符串toString返回。 ...

toString()是返回它本身吗
作者: 杨丽静    时间: 2014-1-4 17:29
readLine方法原理:读一行也是在硬盘上一个一个读取,使用的还是read方法。只不过在内部有一个封装好的数组,通过read方法把数据一个一个放入数组缓冲区中,当遇到\r时就不存了当判断到\n时,就认为结束了,就把存好的数据返回。所以返回回车符之前的数据内容。
作者: 黄晓鑫    时间: 2014-1-4 17:38
{:soso_e141:}
作者: 张洪慊    时间: 2014-1-4 17:38
那么试想如果连line.separator都返回的话,那这一行到哪是个头??
因此line.separator作为每行的结束标志,当扫描到->奥这一行结束了.
作者: 李兴    时间: 2014-1-4 18:04
readLine()是BufferedReader内部封装的读取一行的方法,它内部是一个char类型的数组,也是通过循环调用read方法一个字节一个字节的读取并存入char数组中,通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行,就跳出循环,不将结束符存入数组
java源码如下

  1. charLoop:
  2.                 for (i = nextChar; i < nChars; i++) {
  3.                     c = cb[i];
  4.                     if ((c == '\n') || (c == '\r')) {  //遇到结束符,符合条件,跳出循环
  5.                         eol = true;
  6.                         break charLoop;
  7.                     }
  8.                 }
复制代码


最后将char数组作为参数存入StringBuffer中,并返回

java源码如下

  1. if (s == null)
  2.                     s = new StringBuffer(defaultExpectedLineLength); //将char数组存入StringBuffer
  3.                 s.append(cb, startChar, i - startChar);

  4. if (s != null && s.length() > 0)
  5.                         return s.toString();  //返回
  6.                     else
  7.                         return null;

复制代码

作者: 高亮亮    时间: 2014-1-4 18:19
  1. /*
  2. 需求:
  3. 利用装饰设计模式,模仿jvm底层实现BufferedReader或者BufferedWriter的方式,自定义读写缓冲区.
  4. 思路:
  5. 缓冲区其实就是对默认的字符输入输出流(FileReader和FileWriter)字节输入输出流进行功能修饰.
  6. 用到了装饰设计模式.
  7. 步骤:
  8. 1.自定义方法,参数列表为需要的输入或者输出流.
  9. 2.将作为参数传递的输入输出流Read或者Writer方法进行缓冲区功能性加强.
  10. 3.封装自定义方法类.作为自定义缓冲区类.
  11. */

  12. import java.io.*;

  13. class MyBufferedReader{

  14.         //为了让整个类都能调用fr的方法进行装饰.
  15.         private FileReader fr;

  16.         MyBufferedReader(FileReader fr){//让该类一旦实例化,必然存在一个FileReader对象.
  17.                 this.fr = fr;
  18.         }
  19.        
  20.         //定义读取一行的方法.
  21.         public String readLine()throws IOException{
  22.                 int ch = 0;
  23.                 StringBuilder line=new StringBuilder();
  24.                 while((ch=fr.read())!=-1){
  25.                         if (ch=='\r'){
  26.                                 if ((ch=fr.read())=='\n'){//同时遇到
  27.                                         return line.toString();
  28.                                 }else{
  29.         //                                line.append('\r');        //如果单单遇到\r而不是\r\n,就把\r放进读取的字符串中.       
  30.                                 }
  31.                         }
  32.                         line.append((char)ch);
  33.                 }
  34.                 if (line.length()!=0)//当读到结尾,line中还存在数据的话,就返回这些数据.
  35.                         return line.toString();
  36.                 return null;
  37.         }

  38.         //定义关闭资源方法.
  39.         public void close()throws IOException{
  40.                 fr.close();
  41.         }
  42. }

  43. class MyBufferedReaderTest
  44. {
  45.         public static void main(String[] args)throws IOException{
  46.                 MyBufferedReader mbr = new MyBufferedReader(new FileReader("abc.txt"));
  47.                 String line = null;
  48.                 while((line=mbr.readLine())!=null){
  49.                         System.out.println(line);
  50.                 }
  51.                 mbr.close();
  52.         }
  53. }
复制代码

作者: 途遥子若    时间: 2014-1-5 10:54
杨丽静 发表于 2014-1-4 17:29
readLine方法原理:读一行也是在硬盘上一个一个读取,使用的还是read方法。只不过在内部有一个封装好的数组 ...

:handshake
作者: 途遥子若    时间: 2014-1-5 10:55
高亮亮 发表于 2014-1-4 18:19

灰常感谢
作者: 途遥子若    时间: 2014-1-5 10:56
高亮亮 发表于 2014-1-4 18:19

灰常感谢
作者: 途遥子若    时间: 2014-1-5 11:11
李兴 发表于 2014-1-4 18:04
readLine()是BufferedReader内部封装的读取一行的方法,它内部是一个char类型的数组,也是通过循环调用read ...

嗯嗯,:)三克油




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