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

java.io.BufferedOutputStream 源码分析的更多相关文章

  1. java.io.BufferedInputStream 源码分析

    BufferedInputStream是一个带缓冲区的输入流,在读取字节数据时可以从底层流中一次性读取多个字节到缓冲区,而不必每次读取操作都调用底层流,从而提高系统性能. 先介绍几个关键属性 //默认 ...

  2. java.io.ByteArrayOutputStream 源码分析

    ByteArrayOutputStream 内部包含了一个缓冲区,缓冲区会随着数据的不断写入而自动增长,俗称内存流. 首先看一下俩个属性,buf是内部缓冲区,count是记录写入了多少个字节. pro ...

  3. java.io.ByteArrayInputStream 源码分析

    ByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节. 成员变量 //由该流的创建者提供的 byte 数组. protected byte buf[]; //要从 ...

  4. 细说并发5:Java 阻塞队列源码分析(下)

    上一篇 细说并发4:Java 阻塞队列源码分析(上) 我们了解了 ArrayBlockingQueue, LinkedBlockingQueue 和 PriorityBlockingQueue,这篇文 ...

  5. Java split方法源码分析

    Java split方法源码分析 public String[] split(CharSequence input [, int limit]) { int index = 0; // 指针 bool ...

  6. 【JAVA】ThreadLocal源码分析

    ThreadLocal内部是用一张哈希表来存储: static class ThreadLocalMap { static class Entry extends WeakReference<T ...

  7. 【Java】HashMap源码分析——常用方法详解

    上一篇介绍了HashMap的基本概念,这一篇着重介绍HasHMap中的一些常用方法:put()get()**resize()** 首先介绍resize()这个方法,在我看来这是HashMap中一个非常 ...

  8. 【Java】HashMap源码分析——基本概念

    在JDK1.8后,对HashMap源码进行了更改,引入了红黑树.在这之前,HashMap实际上就是就是数组+链表的结构,由于HashMap是一张哈希表,其会产生哈希冲突,为了解决哈希冲突,HashMa ...

  9. Java中ArrayList源码分析

    一.简介 ArrayList是一个数组队列,相当于动态数组.每个ArrayList实例都有自己的容量,该容量至少和所存储数据的个数一样大小,在每次添加数据时,它会使用ensureCapacity()保 ...

随机推荐

  1. spring MVC中传递的参数对象中包含list的情况

    测试需要的jar包:spring 3.2.jar +  jackson-all-1.8.5.jar. 写代码时碰到个需要将对象里的子明细一起传递到controller里去,当时就想直接将参数一起传递过 ...

  2. Linux 定时任务【转载,整理】

    目前,我已知的定时任务实现方法有两种:cron or systemd job,这里主要介绍cron的用法 一.crontab 简介 crontab命令的功能是在一定的时间间隔调度一些命令的执行.该命令 ...

  3. How to get current timestamps in Java

    How to get current timestamps in Java Timestamp timestamp = new Timestamp(System.currentTimeMillis() ...

  4. 【Unity】第8章 GUI开发

    分类:Unity.C#.VS2015 创建日期:2016-04-27 一.简介 前面的章节中实际上已经多次使用了GUI,只不过用法都比较简单,这一章系统地介绍Unity 5.x自带的GUI(称为Uni ...

  5. OpenCV中图像算术操作与逻辑操作

    OpenCV中图像算术操作与逻辑操作 在图像处理中有两类最重要的基础操作各自是图像点操作与块操作.简单点说图像点操作就是图像每一个像素点的相关逻辑与几何运算.块操作最常见就是基于卷积算子的各种操作.实 ...

  6. EF框架 对字段属性为NULL的空值处理 类型前面加上?保证EF列表读取显示数据不会报异常

    譬如: public int? FlowStatus { get; set; } public DateTime? UpdateTime { get; set; }

  7. 【ARM】2440裸机系列-gpio按键控制

    功能 通过GPIO,实现按键1点亮LED1,按键2点亮LED2…… 说明 1)因为2440的按键只涉及行,所以在扫描按键时比2410简单了很多 2)在进行移位操作之前,必须进行数据寄存器的初始化,否则 ...

  8. mybatis使用注解往postgresql数据库表insert数据[主键自增]的写法

    建表SQL: DROP TABLE IF EXISTS person; CREATE TABLE person( person_id serial PRIMARY KEY NOT NULL, pers ...

  9. 当music-list向上滑动的时候,设置layer层,随其滚动,覆盖图片,往下滚动时候,图片随着展现出来

    1.layer层代码: <div class="bg-layer" ref="layer"></div> 2.在mounted()的时候 ...

  10. 通俗易懂讲解happens-before原则

      在接下来的叙述里我首先会说明happens-before规则是干什么用的,然后用一个简单的小程序说明happens-before规则 一.happens-before规则 我们编写的程序都要经过优 ...