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