黑马程序员-81-自定义BufferedReader类

本文介绍了如何自定义一个字符读取流缓冲区,通过继承Reader类,并使用StringBuilder替代数组来实现BufferedReader的readLine方法。详细步骤包括覆盖close()、read(char[], int, int)方法,创建构造函数,以及定义readLine和close方法。强调了异常处理的原则:谁调用谁处理。" 116065152,8452874,Salesforce黑科技:通过连接应用调用User Interface API,"['salesforce', 'apex', 'API调用', '记录管理', '自定义应用']
摘要由CSDN通过智能技术生成

 ——- android培训java培训、期待与您交流! ———-

练习:自定义一个字符读取流缓冲区,并演示
原理分析:
BufferedReader中的readLine方法其实还是调用了read方法.
原理就是read+数组
在本例为了我们采用StringBuilder代替数组
所以,我的自定义字符读取流缓冲区原理就是:
StringBuilder+Reader类的read方法.

步骤:
1 自定义一个字符读取流缓冲区类,继承Reader类
2 读取一个java文件进行演示

如何实现步骤1呢?
1.1 继承Reader类
1.2 覆盖Reader类中的抽象方法close(),read(char[] buf,int off, int length)
1.3 自定义构造函数,形式参数包含FileReader
1.4 自定义readLine方法和close方法
1.5 在功能上声明异常.注意异常的处理原则:谁调用谁处理,所以对于自定义功能,应当声明,不应当try

import java.io.*;

class MyBufferedReader extends Reader
{
    private FileReader fr;//声明文件字符读取流对象
    //自定义构造函数,包装FileReader对象
    MyBufferedReader(FileReader fr)
    {
        this.fr = fr;
    }

    //覆盖Reader的抽象方法
    //覆盖close()
    public void close() throws IOException
    {
        fr.close();
    }

    //覆盖read(char[] buf,int off, int length)
    public int read(char[] buf,int off, int length)throws IOException
    {
        //读取数组中的一部分字符
        //因为FileReader继承自InputStreamReader类,该类实现了此方法,所以只要调用即可
        return fr.read(buf,off,length);
    }

    //自定义readLine方法
    //通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。 
    public String myReadLine()throws IOException
    {
        //创建字符串缓冲区
        StringBuilder sb = new StringBuilder();
        int ch = 0;
        while((ch=fr.read())!=-1)
        {
            if(ch=='\r')
                continue;//读到回车符,该行结束
            if(ch=='\n')
                return sb.toString();//读到换行符,该行结束
            else
                sb.append((char)ch);//否则该行没结束,把字符添加到缓冲区
        }
        if(sb.length()!=0)
            return sb.toString();//如果最后一行没有换行,返回该行,结束
        return null;//定义结束标记:null,表示读到结尾了
    }

    //自定义close方法
    public void myClose()throws IOException
    {
        fr.close();
    }
}
public class MyBufferedReaderDemo 
{
    public static void main(String[] args) 
    {   
        MyBufferedReader myBuf = null;//声明自定义字符串缓冲区读取流对象,
        try
        {
            //创建自定义字符串缓冲区读取流对象,
            myBuf = new MyBufferedReader(new FileReader(new File("BufferedWriterDemo.java")));
            //声明读取行
            String line = null;
            //循环读取行,并打印在控制台
            while((line=myBuf.myReadLine())!=null)
            {
                System.out.println(new String(line));
            }
        }
        catch (IOException e)
        {
            System.out.println(e.toString());
        }
        finally
        {
            if(myBuf!=null)
                try
                {
                    myBuf.myClose();
                }
                catch (IOException ex)
                {
                    System.out.println(ex.toString());
                }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值