介绍:
ByteArrayOutputStream 对byte类型数据进行写入的类 相当于一个中间缓冲层,将类写入到文件等其他outputStream。它是对字节进行操作,属于内存操作流
源码解析:
public class ByteArrayOutputStream extends OutputStream {
}
从上述代码中可以看出ByteArrayOutputStream继承了OutputStream类
ByteArrayOutputStream类中的成员和方法的介绍:
protected byte buf[];
//数据存储的地方
protected int count;
//计数器 表示数据的个数
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中有三个write()方法:
//将指定的int类型的数据写入此 byte 数组输出流
public void write(int b){ensureCapacity(count + 1);buf[count] = (byte) b;count += 1;
}/**将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此 byte 数组输出流。*/
public 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);count += len;
}
ByteArrayOutputStream中的其他方法
WriteTo方法
/**将此 byte 数组输出流的全部内容写入到指定的输出流参数中,
这与使用out.write(buf, 0, count) 调用该输出流的 write 方法效果一样*/public synchronized void writeTo(OutputStream out) throws IOException {out.write(buf, 0, count);}
reset()方法
/**将此 byte 数组输出流的 count 字段重置为零,从而丢弃输出流中目前已累积的所有输出。通过重新使用已分配的缓冲区空间,可以再次使用该输出流*/public synchronized void reset() {count = 0;}
toByteArray()方法
//创建一个新分配的 byte 数组。其大小是此输出流的当前大小,并且缓冲区的有效内容已复制到该数组中。public synchronized byte toByteArray()[] {return Arrays.copyOf(buf, count);}
size()方法
//返回缓冲区的当前大小public synchronized int size() {return count;}
toString()方法
/**
使用平台默认的字符集,通过解码字节将缓冲区内容转换为字符串。新 String 的长度是字符集的函数,因此可能不等于缓冲区的大小。 此方法总是使用平台默认字符集的默认替代字符串替代错误输入 (malformed-input) 和不可映射字符 (unmappable-character) 序列。如果需要对解码过程进行更多控制,则应该使用 CharsetDecoder 类。
*/public synchronized String toString() {return new String(buf, 0, count);}
扩容方式:
ByteArrayOutputStream是byte类型的数组进行自动扩容的。当写入长度大于数组原有长度时,就会自动调用grow()方法, buf数组是动态增长的 先扩容为2倍,如果size还是不够 就让数组f的sieze等于minCapacity
//扩容方法:private void ensureCapacity(int minCapacity) {// overflow-conscious codeif (minCapacity - buf.length > 0)grow(minCapacity);}//grow方法:private void grow(int minCapacity) {// overflow-conscious codeint 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);}