当前位置: 首页 > news >正文

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();
    }

相关文章:

  • 小程序 · 配置总结
  • 程序员的自我修养 学习心得(2)
  • Django集成Markdown编辑器【附源码】
  • 首页查询功能的一次实现过程
  • 关于LightMapping和NavMesh烘焙的动态载入
  • struts2之example
  • 前嗅ForeSpider教程:采集58同城
  • 配置与管理Apache服务器
  • Go标准容器之List
  • 关于RFC
  • MongoDB官方C#驱动中查询条件Query用法
  • 分享我在学习web前端路上踩过的一些坑
  • MyEclipse10安装PyDev插件
  • Python3获取新浪微博内容乱码问题
  • boost::thread类
  • python3.6+scrapy+mysql 爬虫实战
  • 收藏网友的 源程序下载网
  • angular2 简述
  • HTTP--网络协议分层,http历史(二)
  • java取消线程实例
  • Linux各目录及每个目录的详细介绍
  • nginx 负载服务器优化
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Spring Boot MyBatis配置多种数据库
  • 跨域
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 算法之不定期更新(一)(2018-04-12)
  • 新版博客前端前瞻
  • ​2020 年大前端技术趋势解读
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • $GOPATH/go.mod exists but should not goland
  • ( 10 )MySQL中的外键
  • (LeetCode) T14. Longest Common Prefix
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (附源码)计算机毕业设计大学生兼职系统
  • (黑马C++)L06 重载与继承
  • (四)库存超卖案例实战——优化redis分布式锁
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)【Hibernate总结系列】使用举例
  • .net 获取url的方法
  • .Net8 Blazor 尝鲜
  • .NetCore 如何动态路由
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • []串口通信 零星笔记
  • [20190113]四校联考
  • [Angular] 笔记 8:list/detail 页面以及@Input
  • [BZOJ1040][P2607][ZJOI2008]骑士[树形DP+基环树]
  • [c]扫雷
  • [c++] 自写 MyString 类
  • [C++参考]拷贝构造函数的参数必须是引用类型
  • [CISCN 2019华东南]Web11