分析BufferedWriter源码 探究写文件效率

先看两个实例
代码一:

 try {
        FileWriter writer = new FileWriter(fileName);
        BufferedWriter bw = new BufferedWriter(writer);

        //吐出指定数个纪录
        for (int i = 0; i < 10; i++) {
            bw.write("str1")
        }

        bw.close();
        writer.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

代码二

 try {
        FileWriter writer = new FileWriter(fileName);
        BufferedWriter bw = new BufferedWriter(writer);

        string str = "";
        for (int i = 0; i < 10; i++) {
            str += "str1";
        }
        bw.write(str)

        bw.close();
        writer.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

表面上看代码二效率要高些,毕竟只有一次“write”动作
其实研究下BufferedWriter 源码,其实这两种方式效率是差不多的。
我们可以跳进代码探究其一步步实现(JDK1.7)。
构造

//这里已经制定了缓存区大小defaultCharBufferSize 
//private static int defaultCharBufferSize = 8192;
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"));
    }

写文件操作(源码如下)

//Writer.java
public void write(String str) throws IOException {
        write(str, 0, str.length());
    }

write调用如下代码
由此可见达到缓冲区大小,才会调用写流操作
BufferedWriter.java
private char cb[];,
所以 cb 是全局的,

//BufferedWriter.java
    public void write(String s, int off, int len) throws IOException {
        synchronized (lock) {
            ensureOpen();

            int b = off, t = off + len;
            while (b < t) {
                int d = min(nChars - nextChar, t - b);
                //cb 是全局的,
                s.getChars(b, b + d, cb, nextChar);
                b += d;
                nextChar += d;
                //达到8192 才刷新磁盘
                //nextChar  cb下一个写位置
                //nextChar   至多是"=" 不会大于的,读者可以自己思虑下
                if (nextChar >= nChars)
                    flushBuffer();
            }
        }
    }

flushBuffer 操作

void flushBuffer() throws IOException {
        synchronized (lock) {
            ensureOpen();
            if (nextChar == 0)
                return;
            out.write(cb, 0, nextChar);
            //全局量nextChar  归零
            nextChar = 0;
        }
    }

通过分析可知,代码一和代码二写文件效率是一样的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值