bytearrayinputstream 是 java 中将字节数组作为内存数据源的输入流,内部持数组引用和游标 pos,读取时不修改原数组,支持逐字节/批量读、skip、available,需手动重用或重新创建实例。

ByteArrayInputStream 是 Java 中一个简单的输入流类,它把一个字节数组当作数据源,在内存中直接读取,不涉及磁盘或网络 I/O。
核心原理:把 byte[] 当作“虚拟文件”来读
它内部持有一个 byte[] 引用,并维护一个游标(pos)记录当前读取位置。每次调用 read() 或 read(byte[] b) 时,就从数组中按顺序拷贝字节,同时移动游标。不会修改原数组内容,也不限制读取次数(除非到达末尾)。
基本用法:构造 + 逐字节或批量读取
- 构造时传入字节数组,例如:
new ByteArrayInputStream("Hello".getBytes(StandardCharsets.UTF_8)) -
read()返回单个字节(0–255)或 -1 表示结束 -
read(byte[] b)尽可能填满该数组,返回实际读取字节数(可能小于数组长度) - 支持
skip(long n)跳过若干字节,available()查看剩余可读字节数
注意点:它不自动重置,但可以手动重用
默认情况下,读完一遍后 pos 指向末尾,再次 read() 会立即返回 -1。如需重复读取,不能直接 reset(除非构造时传入的数组未被外部修改),但可以:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 重新 new 一个 ByteArrayInputStream(最常用、最安全)
- 用
mark(int readlimit)+reset()—— 注意:它只对已读部分有效,且 mark 后最多能 reset 一次;如果没调用 mark,reset 会抛IOException
典型场景举例
比如解析一段 JSON 字符串的字节内容:
byte[] jsonBytes = "{\"name\":\"Alice\"}".getBytes(StandardCharsets.UTF_8);
try (ByteArrayInputStream bais = new ByteArrayInputStream(jsonBytes)) {
int b;
while ((b = bais.read()) != -1) {
System.out.print((char) b); // 输出:{"name":"Alice"}
}
}
或者配合其他流使用,如传给 ObjectInputStream、JsonParser 等需要 InputStream 的 API。
不复杂但容易忽略细节:它只是“读视图”,和原数组共享数据,所以要确保数组在流使用期间不被意外修改。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










