ByteArrayOutputStream一共有两个属性
protected byte buf[];//存放数据的字节数组
protected int count;//buf的索引
- write()方法
public synchronized void write(int b) {
ensureCapacity(count + 1);//判断buf的容量是否够存放数据
buf[count] = (byte) b;
count += 1;
}
private void ensureCapacity(int minCapacity) {
// overflow-conscious code
if (minCapacity - buf.length > 0)
grow(minCapacity);//如果容量不够了,则扩容
}
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);
}
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
- 另一个write方法
public synchronized void write(byte b[], int off, int len) {
if ((off < 0) || (off > b.length) || (len < 0) ||
((off + len) - b.length > 0)) {
throw new IndexOutOfBoundsException();
}
ensureCapacity(count + len);//上面已经分析
System.arraycopy(b, off, buf, count, len);//通过数组拷贝将b[]的数据复制到buf[]中去
count += len;//设置当前数据的长度
}
- reset()方法,直接将count设置为0,那么下次在写数据的时候,直接从索引0开始写数据
public synchronized void reset() {
count = 0;
}
- toByteArray()方法,这个很简单,就是将buf[]数据返回,不过需要注意的是,这个操作是会double内存的,数据量太大会很占内存
public synchronized byte toByteArray()[] {
return Arrays.copyOf(buf, count);
}
- close(),这是一个空实现,说明数据写到内存中没有占用资源
public void close() throws IOException {
}
好了,到这里ByteArrayOutputStream的源码也就分析完成了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。