这是《水煮 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

本文详细分析了Java 8中ByteArrayOutputStream类的源码,包括构造函数、写入字节数据的方法、字节数组扩容机制、将字节数组转换为字符串的方法以及其他辅助方法。该类在内存中创建字节数组缓冲区,用于存储输出流数据,并能自动扩容。文章介绍了其扩容策略、同步方法以及转换为字符串的实现细节。

9733

被折叠的 条评论
为什么被折叠?



