java IO 字符流(三)BufferedReader与BufferedWriter

BufferedReader与BufferedWriter分别继承自Reader与Writer,也是这两者的装饰者,具体的可以了解一下装饰者模式(在不改变被装饰者的情况下,动态的给被装饰者添加职责),两者主要的作用就是通过使用缓冲区提高对文本操作的效率。
一、BufferedReader
通过查看源码可以发现其构造方法有两种,其实可以理解成一种(都是要设置缓冲区大小的,一个用默认的,一个用自定义的)
这里写图片描述
当然从源码中还可以了解到,其缓冲区默认大小为8192,而默认的读取一行的最大长度为80,这个可能面试的时候会问到吧。
通过查看源码可以大概发现其读取流程:
当BufferedReader读取文本时会将字符先读取到缓冲区中,而后调用read方法时都是从缓冲区中读取的,如果缓冲区读完了,且文本中还有数据,则再去文本中将字符读取到缓冲区中。这个可以自己断点一下,能看到(可以手动将缓冲区大小设置为3或者其他小一点的数据)。
这里写图片描述
从上面可以看到如果满足条件返会的cb中的字符,其中fill方法的代码如下:
这里写图片描述
原理其实不难,作用也是显而易见的,就是为了提高读取效率。使用的设计模式就是装饰者模式。具体的可以自己设置断点看一下,很简单。

public class BufferedReaderTest {

/**
 * @param args
 */
public static void main(String[] args) {
    FileReader reader = null;
    try {
        reader = new FileReader("D:\\test.txt");
        /*为了方便看到效果,设置缓冲区大小为3个字符*/
        BufferedReader bfd = new BufferedReader(reader,3);
        String str = "";
        while((str=bfd.readLine())!=null){
            System.out.println(str);
        }
        bfd.close();
    } catch (IOException e) {
        e.printStackTrace();
    }finally{
        if(reader!=null){
            try {
                reader.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

}

可能其中比较值得注意的就是readLine长度是有限制的。
二、BufferedWriter
与BufferedReader类似,其构造方法有两种,如下:
这里写图片描述

同样可以设置缓冲区大小,也可以使用默认的缓冲区,默认值8192,为什么是这个数值,同样表示不理解。
这里写图片描述

同样BufferedWriter是为了提高输出效率的,每次将字符放入缓冲区,然后统一输出,提高效率

public class BufferedWriterTest {

/**
 * @param args
 */
public static void main(String[] args) {
    FileWriter writer = null;

    try {
        writer = new FileWriter("D:\\writer.txt");
        BufferedWriter bfw = new BufferedWriter(writer,2);
        bfw.write("我是一个测试的句子!");
        bfw.flush();
        bfw.close();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally{
        try {
            writer.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

}


BufferedReader与BufferedWriter没有想象的那么难理解,源码也不是很难,主要作用就是提高效率,使用的时候尽量使用BufferedReader与BufferedWriter。项目中用到的一般比较少,面试的时候可能会多一点吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值