这是《水煮 JDK 源码》系列 的第2篇文章,计划撰写100篇关于JDK源码相关的文章
ByteArrayOutputStream
类位于 java.io
包下,继承于 OutputStream
类,从字面上可以看出,它表示的是一个字节数组输出流。它的实现方式是先在内存中创建一个字节数组缓冲区 byte buf[]
,然后把所有发送到输出流的数据保存于字节数组缓冲区中,其中字节数组缓冲区会随着数据的增加而自动调整大小,其UML 类图如下:
1、构造函数
ByteArrayOutputStream
类提供两个构造方法,分别如下:
public ByteArrayOutputStream() {
this(32);
}
public ByteArrayOutputStream(int size) {
// 传入的 size 不能小于 0
if (size < 0) {
throw new IllegalArgumentException("Negative initial size: "
+ size);
}
buf = new byte[size];
}
无参构造方法默认创建一个32字节的缓冲区,而另一个构造方法则是创建指定大小为 size 的缓冲区。
ByteArrayOutputStream
类中有3个成员变量 buf[]
、 count
和 MAX_ARRAY_SIZE
,其定义如下:
/**
* 字节数组.
*/
protected byte buf[];
/**
* 字节数组大小.
*/
protected int count;
/** 最大数组大小 */
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
在成功创建字节数组输出流后,就可以调用相应的方法进行操作,操作方法主要分为下面几类:
-
写入字节数据方法
-
字节数组扩容方法
-
将字节数组转换为字符串方法
-
其他方法
2、写入字节数据方法
ByteArrayOutputStream
提供了2个写入方法,1个写入到其他输出流方法,分别如下:
public synchronized void write(int b)
:将指定的字节写入字节数组输出流;public synchronized void write(byte b[], int off, int len)
:将指定字节数组中从偏移量 off 开始的 len长度的字节写入字节数组输出流中public synchronized void writeTo(OutputStream out) throws IOException
:将字节数组输出流中的全部数据写入到输出流参数中,调用的是OutputStream
的write()
方法
这3个写入方法都使用 synchronized
关键字,即为同步方法。
public synchronized void write(int b) {
// 首先检查字节数组大小,由于写入了 b,所以新的数组容量至少为 count + 1
// count 代表之前写入的数据大小
ensureCapacity(count + 1);
// 写入的新数据存放在数组的最后
buf[count] = (byte) b;
count += 1;
}
public synchronized void write(byte b[], int off, int len) {
// 首先检查要写入的数据是否越界了
if