当前位置: 首页 > article >正文

ByteArrayOutputStream流

介绍:

ByteArrayOutputStream 对byte类型数据进行写入的类 相当于一个中间缓冲层,将类写入到文件等其他outputStream。它是对字节进行操作,属于内存操作流

一源码解析:

public class ByteArrayOutputStream extends OutputStream {
}

从上述代码中可以看出ByteArrayOutputStream继承了OutputStream类

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的其他方法

toByteArray()方法

//创建一个新分配的 byte 数组。其大小是此输出流的当前大小,并且缓冲区的有效内容已复制到该数组中。
    public synchronized byte toByteArray()[] {
        return Arrays.copyOf(buf, count);
    }
 ByteArrayOutputStream转ByteArrayInputStream或ByteArrayInputStream
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
InputStream inputStream1 = new ByteArrayInputStream(outputStream.toByteArray());

ByteArrayOutputStream流的扩容原理

初始容量为32字节,最大容量以堆内存的老年代中最大对象容量为准,超过堆内存的老年代中最大对象容量就会报错.

当数据满了需要扩容时,ByteArrayOutPutStream只能重新创建一个容量更大的byte[],来替换之前的,并且复制数据到新byte[]中。当写入长度大于数组原有长度时,就会自动调用grow()方法, buf数组是动态增长的 先扩容为2倍,如果size还是不够 就让数组的sieze等于minCapacity

//扩容方法:
    private void ensureCapacity(int minCapacity) {
        // overflow-conscious code
        if (minCapacity - buf.length > 0)
            grow(minCapacity);
    }

//grow方法:
    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);
    }


http://www.kler.cn/a/274154.html

相关文章:

  • YOLOv11 引入高效的可变形卷积网络 DCNv4 | 重新思考用于视觉应用的动态和稀疏算子
  • golang 并发--goroutine(四)
  • 如何在 Ubuntu 22.04 上安装和使用 Composer
  • HTMLCSS:惊!3D 折叠按钮
  • 石岩基督教福音堂
  • 华为实训课笔记 2024 1223-1224
  • AMRT 3D 数字孪生引擎(轻量化图形引擎、GIS/BIM/3D融合引擎):智慧城市、智慧工厂、智慧建筑、智慧校园。。。
  • 电子科技大学链时代工作室招新题C语言部分---题号G
  • 精密星历解析
  • Android 启动service(Kotlin)
  • flink重温笔记(十八): flinkSQL 顶层 API ——实时数据Table化(涵盖全面实用的 API )
  • CTF题型 php反序列化进阶(1) php原生类 例题和总结
  • 接口测试基础+requests库
  • 手写 UE4中的 TArray
  • 【JAVA快速编写UI】 Java 编写一个编码转换和加解密工具,可以创建一个简单的 GUI 应用程序(例子)
  • 力扣大厂热门面试算法题 43-45
  • 企企通:AI技术赋能供应链智能化升级,打造数字产业集群
  • 前端流式(stream)请求,获取持续响应的方式
  • 基于java的宠物信息交流平台设计(含源文件)
  • json-server库的使用,实现数据模拟
  • PyTorch学习笔记之基础函数篇(十三)
  • Spring Security的开发
  • Python-GEE绘制DEM精美图片
  • iOS图片占内存大小与什么有关?
  • OSPF特殊区域(stub\nssa)
  • 电商数据采集效率开挂【Python电商数据采集API接口】