dataoutputstream写入复杂结构需手动拆解对象并顺序写入各字段,如person类按writeutf(name)、writeint(age)、writedouble(height)、writeboolean(active)顺序写入,string用writeutf()而非过时方法,数组和嵌套对象需先写长度再循环或逐字段写入,读取端须严格按相同顺序反向解析,且必须用try-with-resources确保底层流正确关闭。

用 DataOutputStream 写入复杂结构数据,核心是“拆解 + 顺序写入”,它本身不支持直接序列化对象,必须手动把对象的每个字段按类型逐个写入。
明确数据结构并规划写入顺序
比如有一个 Person 类:姓名(String)、年龄(int)、身高(double)、是否活跃(boolean)。不能直接 writeObject,得自己定义二进制格式。建议先在纸上或注释里写清楚字段顺序和类型,例如:
- 先写姓名长度(int),再写姓名字节(UTF-8 编码)
- 接着写年龄(int)
- 再写身高(double)
- 最后写状态(boolean)
顺序必须和读取时严格一致,否则数据错位。
用 DataOutputStream 逐字段写入
DataOutputStream 提供了 writeInt()、writeDouble()、writeBoolean() 等方法,但对 String 要小心:它没有 writeString()(那是过时且平台依赖的方法),推荐用 writeUTF() —— 它会自动写入长度前缀(2 字节),再写 UTF-8 编码内容,读取时用 readUTF() 才能正确还原。
示例代码片段:
try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("person.dat"))) {
String name = "张三";
int age = 28;
double height = 175.5;
boolean active = true;
dos.writeUTF(name); // 自动处理长度和编码
dos.writeInt(age);
dos.writeDouble(height);
dos.writeBoolean(active);
}
处理数组、列表等集合类型
没有内置方法写整个数组,需手动控制数量 + 循环写入。例如写 int[] scores:
- 先
dos.writeInt(scores.length) - 再用 for 循环对每个元素调用
dos.writeInt(score)
嵌套对象(如 Address address 字段)也一样:把它拆成 street(String)、zip(int)等字段,按约定顺序依次写入。关键不是“多复杂”,而是“可还原”——只要读取端按同样逻辑反向操作,就能重建原始结构。
注意异常与资源关闭
DataOutputStream 的写入方法可能抛出 IOException,务必捕获或声明。推荐用 try-with-resources 自动关闭底层流(如 FileOutputStream),避免文件句柄泄漏。不要只关 DataOutputStream 而忽略底层流,否则缓冲区内容可能未真正写入磁盘。
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











