ByteArrayInputStream 用字节数组构建内存输入流,支持全量/部分读取,共享数组引用,配合 InputStreamReader 等解析,适用于测试、加解密等场景,无需关闭但不宜处理超大数组。

Java 中用 ByteArrayInputStream 可以把字节数组当作输入流来读取,适合处理内存中已有的二进制数据,比如解析配置、解密结果、网络响应缓存等场景。它不涉及文件或网络 I/O,纯内存操作,轻量且高效。
从字节数组创建 ByteArrayInputStream
构造器直接接收 byte[],支持指定起始位置和长度,避免复制数组:
- 全量读取:
new ByteArrayInputStream(data) - 部分读取(跳过前 5 字节,读取接下来 10 字节):
new ByteArrayInputStream(data, 5, 10)
注意:该流不会修改原数组,但与数组共享引用——后续修改数组内容会影响流的读取结果(除非传入的是副本)。
配合标准 IO 工具类读取内容
可搭配 InputStreamReader、BufferedReader 或 DataInputStream 等,按需解析:
立即学习“Java免费学习笔记(深入)”;
- 读字符串(UTF-8):
new BufferedReader(new InputStreamReader(bais, StandardCharsets.UTF_8)) - 读基本类型(如 int、double):
new DataInputStream(bais) - 转成字符串(简单场景):
new String(bais.readAllBytes(), StandardCharsets.UTF_8)(JDK 9+)
常见用途示例
适用于不需要落盘、快速复用内存数据的场景:
- 单元测试中模拟 HTTP 响应体:
new ByteArrayInputStream("{\"code\":200}".getBytes(UTF_8)) - 加密后解密前的数据流转:
byte[] cipherBytes = encrypt(plain); ByteArrayInputStream in = new ByteArrayInputStream(cipherBytes); - 解析 ZIP 内部某个 entry 的字节内容(配合
ZipInputStream提取出的 byte[])
注意事项
ByteArrayInputStream 是不可重置的单次流(除非手动标记并重置),且不支持 markSupported() 返回 true(JDK 8 及以前默认返回 false;JDK 9+ 已改为 true,但仅限调用 mark() 后可 reset()):
- 若需多次读取,建议重复创建新实例,或改用
ByteBuffer+Channels.newChannel() - 无需显式关闭,但为保持代码风格统一,仍可加
try-with-resources(它实现了AutoCloseable,关闭无实际作用) - 不适合超大字节数组(如几百 MB),会占用堆内存,此时应考虑内存映射或分块处理


















