java源码-BufferedWriter

开篇

 BufferedWriter和BufferedReader是对称的,一并分析下源码。


源码分析

构造函数

  • BufferedWriter的构造函数通过缓冲区char cb[]数组保存待持久化字符
  • 缓存区默认大小为8192
  • BufferedWriter跟BufferedReader一样采用装饰者模式进行设计,通过内部Writer out对象保存被装饰的Writer对象。
  • BufferedWriter的写操作通过被装饰的out对象进行数据写入。
public class BufferedWriter extends Writer {

    private Writer out;

    private char cb[];
    private int nChars, nextChar;
    private static int defaultCharBufferSize = 8192;
    private String lineSeparator;

    public BufferedWriter(Writer out) {
        this(out, defaultCharBufferSize);
    }

    public BufferedWriter(Writer out, int sz) {
        super(out);
        if (sz <= 0)
            throw new IllegalArgumentException("Buffer size <= 0");
        this.out = out;
        cb = new char[sz];
        nChars = sz;
        nextChar = 0;

        lineSeparator = java.security.AccessController.doPrivileged(
            new sun.security.action.GetPropertyAction("line.separator"));
    }



write过程

  • write过程先把数据写到缓冲区cb数组当中
  • 当缓冲区cb数组当中的字符超出最大缓存区大小,那么就执行flush保存数据
    public void write(int c) throws IOException {
        synchronized (lock) {
            ensureOpen();
            // 超出缓存区大小就执行flush操作
            if (nextChar >= nChars)
                flushBuffer();
            cb[nextChar++] = (char) c;
        }
    }

    void flushBuffer() throws IOException {
        synchronized (lock) {
            ensureOpen();
            if (nextChar == 0)
                return;
            // 将数据通过out对象进行持久化
            out.write(cb, 0, nextChar);
            // 重置缓冲区的起始位置
            nextChar = 0;
        }
    }
    }


类依赖图

  • BufferedWriter的类依赖图如下图,所有的io writer都是继承自Writer作为基类。
img_f109ac82a9c707e94ce6380e6c2fb48e.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值