Java 8 中 ByteArrayOutputStream 类源码分析

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

这是《水煮 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[]countMAX_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:将字节数组输出流中的全部数据写入到输出流参数中,调用的是 OutputStreamwrite() 方法

这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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值