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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马张伟 黑马帝   /  2011-12-21 07:56  /  2300 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马张伟 于 2011-12-22 18:20 编辑

import java.io.FileReader;
import java.io.IOException;

/*
明白了BuffredReader类中特有的方法readLine的原理后
可以自定义一个类中包含和readLine原理一样的方法
来模拟一下BuffreedReader
*/
public class BufferReader {
        public static void main(String[] args) throws IOException{
                FileReader fr=new FileReader("se.txt");
                MyBufferedReader mybuf=new MyBufferedReader(fr);
                String line=null;
                while((line=mybuf.myReadLine())!=null)
                {
                        System.out.println(line);
                }
                mybuf.myClose();
        }

}
class MyBufferedReader{
        private FileReader r;
        MyBufferedReader(FileReader r)
        {
                this.r=r;
        };
        //可以一次读一行数据的方法
        public String myReadLine(){
                StringBuilder sb=new StringBuilder();
                int ch=0;
                try {
                        while((ch=r.read())!=-1)
                        {
                                if(ch=='\r')
                                        continue;;
                                if(ch=='\n')
                                        continue;
                                else
                                sb.append((char)ch);
                        }
                } catch (IOException e) {
                        e.printStackTrace();
                }
                if(sb.length()!=0)
                        return sb.toString();
                return null;
        }
        public void myClose(){
                try {
                        r.close();
                } catch (IOException e) {
                        e.printStackTrace();
                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

5 个回复

倒序浏览
if(ch=='\n')
continue;
这里不应该是continue了吧? 应该是break;
因为是\n是换行符, 如果换行了,readline这个函数就应该返回了, 每次只读一行的啊。
回复 使用道具 举报
因为在Windeows操作系统中换行的操作符为"\r\n",所以
if(ch=='\r')
continue;
这个没错,下面错了,
if(ch=='\n')
continue;  //这里不应该是continue了,读到'\n'时,应该要换行了,换行之前要将前面缓冲区中的字符返回回去,所以要return sb.toString();试试看吧
回复 使用道具 举报
//可以一次读一行数据的方法
    public String myReadLine(){
            StringBuilder sb=new StringBuilder();
            int ch=0;
            try {
                    while((ch=r.read())!=-1)
                    {
                            if(ch=='\r')
                                    continue;;
                            if(ch=='\n')
                            sb.append((char)ch);  ------这块代码应该这样写 返回sb.append((char)ch);    就OK
                            else
                            sb.append((char)ch);
                    }
            } catch (IOException e) {
                    e.printStackTrace();
            }
            if(sb.length()!=0)
                    return sb.toString();
            return null;
    }

刚调试好
回复 使用道具 举报
  1. import java.io.FileReader;
  2. import java.io.IOException;

  3. /*
  4. 明白了BuffredReader类中特有的方法readLine的原理后
  5. 可以自定义一个类中包含和readLine原理一样的方法
  6. 来模拟一下BuffreedReader
  7. */
  8. public class BufferReader {
  9.         public static void main(String[] args) throws IOException{
  10.                 FileReader fr=new FileReader("se.txt");
  11.                 MyBufferedReader mybuf=new MyBufferedReader(fr);
  12.                 String line=null;
  13.                 while((line=mybuf.myReadLine())!=null)
  14.                 {
  15.                         System.out.println(line);
  16.                 }
  17.                 mybuf.myClose();
  18.         }

  19. }
  20. class MyBufferedReader{
  21.         private FileReader r;
  22.         MyBufferedReader(FileReader r)
  23.         {
  24.                 this.r=r;
  25.         };
  26.         //可以一次读一行数据的方法
  27.         public String myReadLine(){
  28.                 StringBuilder sb=new StringBuilder();
  29.                 int ch=0;
  30.                 try {
  31.                         while((ch=r.read())!=-1)
  32.                         {
  33.                                 if(ch=='\r')
  34.                                         continue;
  35.                                 if(ch=='\n')
  36.                                         break;   //应该是break,本身该方法就只是一行一行的读取,当读取到换行符时,说明已到一行了,不该再继续读下去,所以应使用“break;”
  37.                                 else
  38.                                 sb.append((char)ch);
  39.                         }
  40.                 } catch (IOException e) {
  41.                         e.printStackTrace();
  42.                 }
  43.                 if(sb.length()!=0)
  44.                         return sb.toString();
  45.                 return null;
  46.         }
  47.         public void myClose(){
  48.                 try {
  49.                         r.close();
  50.                 } catch (IOException e) {
  51.                         e.printStackTrace();
  52.                 }
  53.         }
  54. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨强 + 1

查看全部评分

回复 使用道具 举报
谢谢大家有了你们学习起来简单多了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马