🔹 一、先看这两个类的职责
| 类名 | 作用 |
|---|---|
ObjectOutputStream | 把 Java 对象序列化为字节(writeObject),写入某种输出流 |
ByteArrayOutputStream | 是一种输出流的实现,会把写进去的所有字节保存到内存的字节数组中 |
它们的关系就像是:
ObjectOutputStream是“写手”📤,
ByteArrayOutputStream是“纸张”📄,
两个必须配合,才能把对象“写”下来。
🔧 二、为什么单独用 ObjectOutputStream 不行?
你不能单独用 ObjectOutputStream,因为它必须写到某个输出流上。
ObjectOutputStream oos = new ObjectOutputStream(...); // ❓你得告诉它写到哪里
它常见的用途是:
| 用法 | 示例 |
|---|---|
| 写入文件 | new FileOutputStream("data.obj") |
| 写入 socket | new Socket.getOutputStream() |
| 写入内存 | new ByteArrayOutputStream() ✅(你现在的场景) |
💥如果没有 ByteArrayOutputStream,写到哪里?
-
你就只能把数据写入磁盘(
FileOutputStream)或网络(SocketOutputStream)等。 -
但你现在是要:
把当前对象写入字节数组,然后再读取出来(用于深拷贝)
👉 这个过程完全在内存中完成,不需要文件或网络,所以你用 ByteArrayOutputStream 是最佳选择!
🔍 三、流程图解(内存中完成的序列化)
MyClass obj = new MyClass();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(obj); // 写对象到内存里的字节数组
byte[] bytes = bos.toByteArray(); // 得到这段字节内容
// 后续可以从这段字节中恢复新对象
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bis);
MyClass clone = (MyClass) ois.readObject(); // 深拷贝的新对象
✅ 总结一句话
| 点 | 内容 |
|---|---|
ObjectOutputStream | 负责把对象写成“字节”,但它不能独立使用,必须依赖一个底层输出流 |
ByteArrayOutputStream | 是内存中的“容器”输出流,用来保存 ObjectOutputStream 写出的字节 |
| 为什么需要它 | 因为你不想写入磁盘、网络,只想把对象写入内存,再读取出来(实现深拷贝) |
不能单独用 ObjectOutputStream 的本质原因 | 它是包装流,必须包一个真正的“输出目标”流(如 ByteArrayOutputStream、FileOutputStream) |
1119

被折叠的 条评论
为什么被折叠?



