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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始



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


评分

参与人数 1黑马币 +3 收起 理由
FFF + 3 神马都是浮云

查看全部评分

11 个回复

倒序浏览
因为 BufferedReader底层封装了,read()方法,读到\r\n后,就会返回 将缓冲区中的 字符串toString返回。
回复 使用道具 举报
776699 发表于 2014-1-4 15:54
因为 BufferedReader底层封装了,read()方法,读到\r\n后,就会返回 将缓冲区中的 字符串toString返回。 ...

toString()是返回它本身吗
回复 使用道具 举报
readLine方法原理:读一行也是在硬盘上一个一个读取,使用的还是read方法。只不过在内部有一个封装好的数组,通过read方法把数据一个一个放入数组缓冲区中,当遇到\r时就不存了当判断到\n时,就认为结束了,就把存好的数据返回。所以返回回车符之前的数据内容。
回复 使用道具 举报
{:soso_e141:}
回复 使用道具 举报
那么试想如果连line.separator都返回的话,那这一行到哪是个头??
因此line.separator作为每行的结束标志,当扫描到->奥这一行结束了.
回复 使用道具 举报
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;

复制代码

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 很给力!

查看全部评分

回复 使用道具 举报
  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. }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
杨丽静 发表于 2014-1-4 17:29
readLine方法原理:读一行也是在硬盘上一个一个读取,使用的还是read方法。只不过在内部有一个封装好的数组 ...

:handshake
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
李兴 发表于 2014-1-4 18:04
readLine()是BufferedReader内部封装的读取一行的方法,它内部是一个char类型的数组,也是通过循环调用read ...

嗯嗯,:)三克油
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马