java.io.BufferedOutputStream 源码分析

BufferedOutputStream  是一个带缓冲区的输出流,通过设置这种输出流,应用程序就可以字节写入到缓冲区中,当缓冲区满了以后再调用底层系统,而不必针对每次字节写入调用底层系统,从而提高系统性能。

 

俩个成员变量,buf是存储字节数据的内部缓冲区,count是缓冲区中的有效字节数。

    protected byte buf[];
    protected int count;

 

构造参数可以指定缓冲区的大小,可以使用默认值8192,也可以自定义大小。

    public BufferedOutputStream(OutputStream out) {
        this(out, 8192);
    }
public BufferedOutputStream(OutputStream out, int size) { super(out); if (size <= 0) { throw new IllegalArgumentException("Buffer size <= 0"); } buf = new byte[size]; }

 

刷新缓冲区数据到底层输出流。

    private void flushBuffer() throws IOException {
        if (count > 0) {
            out.write(buf, 0, count);
            count = 0;
        }
    }

 

输出一个字节。

    public synchronized void write(int b) throws IOException {
     //判断缓冲区buf是否已满,满了就调用底层流将数据写进去。
if (count >= buf.length) { flushBuffer(); }
     //将字节放入到缓冲区中 buf[count
++] = (byte)b; }

 

输出多个字节,

    public synchronized void write(byte b[], int off, int len) throws IOException {
        //判断输出字节的大小,如果大于缓存区的大小,说明缓冲区装不下,那么刷新缓冲区,并将字节数据直接输出到底层流。
        if (len >= buf.length) {
            flushBuffer();
            out.write(b, off, len);
            return;
        }
        //如果缓冲区剩余空间不够,那么刷新缓冲区
        if (len > buf.length - count) {
            flushBuffer();
        }
        //将输出字节写入到缓冲区当buf中
        System.arraycopy(b, off, buf, count, len);
        count += len;
    }

 

刷新输出流,将缓冲区的字节输出到底层流当中,同时刷新底层流。

    public synchronized void flush() throws IOException {
        flushBuffer();
        out.flush();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值