ByteArrayOutputStream流

介绍:

ByteArrayOutputStream 对byte类型数据进行写入的类 相当于一个中间缓冲层,将类写入到文件等其他outputStream。它是对字节进行操作,属于内存操作流

一源码解析:

public class ByteArrayOutputStream extends OutputStream {
}

从上述代码中可以看出ByteArrayOutputStream继承了OutputStream

ByteArrayOutputStream的构造方法有两个:
//创建一个新的 byte 数组输出流。缓冲区的容量最初是 32 字节,如有必要可增加其大小
  public ByteArrayOutputStream() {
        this(32);
    }
    //创建一个新的 byte 数组输出流,它具有指定大小的缓冲区容量(以字节为单位)
  public ByteArrayOutputStream(int size) {
       if (size < 0) {
            throw new IllegalArgumentException("Negative initial size: "
                                               + size);
        }
        buf = new byte[size];
    }
ByteArrayOutputStream的其他方法

toByteArray()方法

//创建一个新分配的 byte 数组。其大小是此输出流的当前大小,并且缓冲区的有效内容已复制到该数组中。
    public synchronized byte toByteArray()[] {
        return Arrays.copyOf(buf, count);
    }
 ByteArrayOutputStream转ByteArrayInputStream或ByteArrayInputStream
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
InputStream inputStream1 = new ByteArrayInputStream(outputStream.toByteArray());

ByteArrayOutputStream流的扩容原理

初始容量为32字节,最大容量以堆内存的老年代中最大对象容量为准,超过堆内存的老年代中最大对象容量就会报错.

当数据满了需要扩容时,ByteArrayOutPutStream只能重新创建一个容量更大的byte[],来替换之前的,并且复制数据到新byte[]中。当写入长度大于数组原有长度时,就会自动调用grow()方法, buf数组是动态增长的 先扩容为2倍,如果size还是不够 就让数组的sieze等于minCapacity

//扩容方法:
    private void ensureCapacity(int minCapacity) {
        // overflow-conscious code
        if (minCapacity - buf.length > 0)
            grow(minCapacity);
    }

//grow方法:
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = buf.length;
        int newCapacity = oldCapacity << 1;
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        buf = Arrays.copyOf(buf, newCapacity);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值