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