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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© IT人 中级黑马   /  2013-11-26 12:20  /  1796 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

readline方法的内部是怎样实现读一行的??????

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 鼓励分+1

查看全部评分

8 个回复

倒序浏览
本帖最后由 帅气的冬瓜 于 2013-11-26 12:43 编辑

哥们  是这样的   不懂的话再问!只先写个方法:import java.io.*;
class newBuffRea
{
       private FileReader r;
     newBufRea(FileReader r){
     this.r=r;
       }
}
public  String newReLi() throws IOException{
        StringBuild sb=new StringBuild();//这里是定义一个临时容器
        int ch=0;
        while((ch=r.read())!=-1)//当读到的一行有值时,r是本类对象。
        {
               if(ch=='\r')//当遇到回车时,继续读取数据。
                    comtinue;
               if(ch=='\n')//当遇到换行符是,返回这一行的字符串
                    return sb.toString();
               else
                    sb.append((char)ch);//如果没有遇到换行符,把读到的添加到容器里面
          }
                 if (sb.length()!=0)//当容器里面有数据时
                        return sb.toString();// 返回字符串
                return null;
}

评分

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

查看全部评分

回复 使用道具 举报
应该是先申请一个char类型的数组或者StringBuilder,然后循环readByte返回byte,循环条件是是否读取到newLine();
读到了就直接返回数组。。转换成String
回复 使用道具 举报
这个原理毕老师讲过了的,就是用与缓冲区关联的流对象的read方法读取数据,但是不是立即处理数据,而是先将数据存储在一个临时容器中(例如StringBuilder),等读到回车标记时将临时容器中的数据一次性返回。
回复 使用道具 举报
这个原理在毕老师的课程中有讲过,我把源码附上,源码中有注释,您看一下就应该明白了
  1. import java.io.FileReader;
  2. import java.io.IOException;

  3. /*
  4. * BufferedReader读取流对象缓冲区中readLine()的原理实现
  5. * readLine()底层用的其实还是read,而关闭缓冲区底层用的其实是关闭流对象
  6. * readLine(),将换行符和回车符以外的字符返回到缓冲区,满一行则返回本行字符
  7. * 如果判断满一行:
  8. * windows中换行:\r\n
  9. * Linux中换行:\n
  10. * 为了实现跨平台,若碰到\r的时候,继续读取下一个字符,若\n则返回字符串
  11. */
  12. public class ReadLineMethodPrinciple {

  13.         public static void main(String[] args)
  14.         {
  15.                 // TODO Auto-generated method stub
  16.                 MyBufferedReader mbuf = null;
  17.                 try
  18.                 {
  19.                         mbuf = new MyBufferedReader(new FileReader("DateTest.java"));
  20.                         String line = "";
  21.                         while((line=mbuf.myReadLine())!=null)
  22.                         {
  23.                                 sop(line);
  24.                         }
  25.                 }
  26.                 catch(IOException e)
  27.                 {
  28.                         throw new RuntimeException("文件读取失败");
  29.                 }
  30.                 finally
  31.                 {
  32.                         try
  33.                         {
  34.                                 if(mbuf!=null)
  35.                                         mbuf.myClose();
  36.                         }
  37.                         catch (IOException e)
  38.                         {
  39.                                 throw new RuntimeException("文件关闭失败");
  40.                         }
  41.                 }
  42.                
  43.                
  44.                
  45.         }
  46.         public static void sop(Object obj)
  47.         {
  48.                 System.out.println(obj);
  49.         }

  50. }
  51. class MyBufferedReader
  52. {
  53.         private FileReader r = null;
  54.         MyBufferedReader(FileReader r)
  55.         {
  56.                 this.r = r;
  57.         }
  58.         public String myReadLine() throws IOException
  59.         {
  60.                 StringBuilder sb = new StringBuilder();
  61.                 int ch = 0;
  62.                 while((ch=r.read())!=-1)
  63.                 {
  64.                         if(ch=='\r')
  65.                                 continue;
  66.                         if(ch=='\n') //遇到\n返回字符串
  67.                                 return sb.toString();
  68.                         sb.append((char)ch); //将字符存入字符串缓冲区
  69.                 }
  70.                 if(sb.length()!=0)   //这个判断是为了最后一行没有换行标记的情况下返回本行字符
  71.                         return sb.toString();
  72.                 return null;
  73.         }
  74.         public void myClose() throws IOException
  75.         {
  76.                 r.close();
  77.         }
  78. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
就是把读取一个字符的方法循环了,当碰到回车符的时候,就把这一行刷新出去。也就是说他还是在一个字符一个字符的读,以回车符作为标记,把标记前面的存到定义好的空间当中,把他以字符串的形式反给你,上面这哥们写的已经很给力了。
回复 使用道具 举报
首先你得有一个缓冲器,也就是new一个字节数组,你这个字节数组得足够装下一行的字节数,然后就把一行里面的字节一个一个往数组里读,当读到换行“\r\n”的时候,就停止读了。这就是readline方法的原理,毕老师视频有讲的!好好看
回复 使用道具 举报
这个 或许可以。
  1. Int 随机数 = 随机数;
  2. int i= 0;
  3. while(readline){
  4. i++;
  5. if(i == 随机数){
  6.   取这一行的内容输出

复制代码
回复 使用道具 举报
王雷1 中级黑马 2013-11-26 13:43:42
9#
上面那个帅气的冬瓜已经很能说明问题了,但冬瓜在帅能是什么样?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马