在 Java 中,ByteArrayInputStream 是 InputStream 的一个实现类,它允许我们把一个字节数组直接当作输入流来读取。这样可以把内存中的数据用统一的流接口处理,而不必关心数据来自文件还是网络。

ByteArrayInputStream 的基本用法
我们只需要把字节数组传给 ByteArrayInputStream 的构造方法,就能得到一个输入流对象。下面的例子展示了如何把字符串变成字节数组,再通过流读取出来。
import java.io.ByteArrayInputStream;
import java.io.IOException;
public class Demo {
public static void main(String[] args) throws IOException {
// 原始内存数据
String text = "hello stream";
byte[] data = text.getBytes("UTF-8");
// 将字节数组包装为输入流
ByteArrayInputStream bais = new ByteArrayInputStream(data);
int b;
// 像读取普通输入流一样读取
while ((b = bais.read()) != -1) {
System.out.print((char) b);
}
bais.close();
}
}
使用缓冲区批量读取
逐个字节读取效率较低,通常我们会用缓冲区批量读取。下面的代码演示了使用字节数组作为缓冲区的方式。
import java.io.ByteArrayInputStream;
import java.io.IOException;
public class BufferDemo {
public static void main(String[] args) throws IOException {
byte[] data = "批量读取示例".getBytes("UTF-8");
ByteArrayInputStream bais = new ByteArrayInputStream(data);
byte[] buf = new byte[1024];
int len;
StringBuilder sb = new StringBuilder();
while ((len = bais.read(buf)) != -1) {
sb.append(new String(buf, 0, len, "UTF-8"));
}
System.out.println(sb.toString());
}
}
mark 与 reset 的支持
ByteArrayInputStream 内部基于内存数组,因此天然支持 mark(int) 和 reset() 方法。我们可以在读取到某个位置后做标记,之后回到标记处重新读取。
import java.io.ByteArrayInputStream;
import java.io.IOException;
public class MarkDemo {
public static void main(String[] args) throws IOException {
byte[] data = "abcdef".getBytes();
ByteArrayInputStream bais = new ByteArrayInputStream(data);
System.out.print((char) bais.read());
System.out.print((char) bais.read());
bais.mark(10); // 标记当前位置
System.out.print((char) bais.read());
System.out.print((char) bais.read());
bais.reset(); // 回到标记位置
System.out.print(" after reset: ");
System.out.print((char) bais.read());
}
}
关闭流是否必要
ByteArrayInputStream 操作的是内存中的字节数组,没有底层系统资源,因此调用 close 方法不会产生实质影响,多次关闭也是安全的。不过为了代码风格统一,仍建议在使用完后关闭,或使用 try-with-resources。
import java.io.ByteArrayInputStream;
import java.io.IOException;
public class TryDemo {
public static void main(String[] args) throws IOException {
byte[] data = "try resource".getBytes();
try (ByteArrayInputStream bais = new ByteArrayInputStream(data)) {
int b;
while ((b = bais.read()) != -1) {
System.out.print((char) b);
}
}
}
}
常见使用场景
- 对二进制数据进行单元测试,避免依赖外部文件
- 把内存中生成的数据直接交给只接受 InputStream 的接口
- 在内存中做数据格式转换或解析的中间步骤
通过上述方式,我们可以很方便地在 Java 中用 ByteArrayInputStream 将内存中的字节数组模拟为输入流,从而复用已有的流处理代码。
JavaByteArrayInputStream字节数组修改时间:2026-07-28 17:09:19