java 字节数组 内存_java 字节流入门(内存数组流)

上篇文章介绍了两种常用的文件输入输出流:java 字节流入门(文件流)

其中向文件中写入的数据都是预先定义好的字节数组 byte[] ,本文介绍另一种在内存中维护字节数组更常用的方式:内存数组输入输出流。

内存数组流,就是和内存中的数组相关的一个流,可以将字节数组写到输出流中,也可以将字节数组从输入流中读出来,不涉及磁盘。

内存数组输出流:ByteArrayOutputStream

内存数组输出流可以看成一个可自动扩容的 byte 数组,可以往里写字节。

默认初始化 32 个字节的大小。

5ede421e43b19abc8b747f7e264c7d80.png

最大容量是 2^31-9 个字节(2G)。只要数据不超过2G,都可以往里写。每次写数据之前,会先计算需要的容量大小,如果需要扩容,扩大到 max{原来的两倍,需要的容量大小}

此外,还可以将 ByteArrayOutputStream 中的字节数组拿出来,拿出来的只是真实存在的数据量。

为了验证扩容方式,把其内部缓冲区拿出来

20dbc0e34d3fb469c01fbd5323f59c74.png

工具类:

0d11818f657b9d09b238c02d4f0114d5.png

主要逻辑:

570957182972f024d17bb36fb4515fc4.png

结果:

f3522c73f631c7c3ceffca5e3d56bc78.png

内存数组输入流:ByteArrayInputStream

这个输入流就是把一个字节数组 byte[] 包装了一下,使其具有流的属性,可顺序读下去。还可标记跳回来继续读。

c093d60af9fd9dc83b0d96978b44e789.png

结果:

e810d43a820e5d9f5af4ddcdb2562510.png

为什么要用 ByteArrayInputStream 而不直接操作 byte 数组?有以下几种情况:

(1)其他接口需要一个 InputStream,而你只有一个 byte[],这时候必须包装一下。

(2)希望以流的方式操作字节数组。

如果其他地方只需要一个 byte[],就没必要包装了,直接传 byte[] 就好了。盲目使用流 是 流氓(大哥你可听到了!)

总结

这两个流都是对内存中的数据进行操作,在需要动态维护一个字节数组时,可以使用 ByteArrayOutputStream,这个变量通常叫 baos 。另外,此次代码和上次代码都放在 github 上了,可以点阅读原文,下边这个也是:

https://github.com/qiaojialin/Java-IO-Learning

致谢:东哥、大哥、康博

估计大部分人看完就返回了,懒得滑上去点关注了,放下来互利共赢~

长按关注!

长按赞赏!

aa3623cc0edd4b1a485101df9de43df6.png

20b3de39fa544651a5f43f7079d367d0.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值