BufferedOutputStream实现了一个缓冲输出流。构建了这样一个输出流后,应用可以往底层流写数据而不用每次写一个字节都调用底层流的方法。
- public class BufferedOutputStream extends FilterOutputStream {
- // 内部缓冲区,存储数据
- protected byte buf[];
- // 缓冲区中有效的字节数(0 ~ buf.length)
- protected int count;
- // 构造方法,创建一个新的输出缓冲流,并把数据写到指定的底层输出流
- 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 {
- // 如果缓冲区满,则刷新缓冲区
- if (count >= buf.length) {
- flushBuffer();
- }
- buf[count++] = (byte)b;
- }
- // 将指定字节数组中的从偏移量off开始len个字节写入此缓冲的输出流
- 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();
- }
- System.arraycopy(b, off, buf, count, len);
- count += len;
- }
- // 刷新此缓冲区和输出流,这会使所有缓冲的输出字节被写出到底层输出流中
- // 为了让缓冲区的数据能被写入到底层输出流中,可以显式调用该方法。或者调用close()方法(父类FilterOutputStream的close()方法),在close方法里,调用该flush()方法
- public synchronized void flush() throws IOException {
- flushBuffer();
- out.flush();
- }
- }