DataOutputStream 是 Java 中以平台无关大端序二进制格式写入基本数据类型的工具类,包装 OutputStream,提供 writeBoolean/writeByte/writeShort/writeChar/writeInt/writeLong/writeFloat/writeDouble/writeUTF 等方法,各方法字节数固定且严格按序写入,需配合 DataInputStream 同序同类型读取。

DataOutputStream 是 Java 中用于将基本数据类型(如 int、double、boolean 等)以**平台无关的二进制格式**写入输出流的工具类。它包装一个底层的 OutputStream(比如 FileOutputStream 或 ByteArrayOutputStream),提供一系列 writeXxx() 方法,确保数据按固定字节序(大端序,Big-Endian)和标准长度写入,方便跨平台读取(对应可用 DataInputStream 读取)。
常用 writeXxx() 方法及对应字节数
每个方法写入的数据长度固定,且按大端序排列(高位字节在前):
-
writeBoolean(boolean v)→ 写入 1 字节(true为1,false为0) -
writeByte(int v)→ 写入 1 字节(只取低 8 位) -
writeShort(int v)→ 写入 2 字节(大端序) -
writeChar(int v)→ 写入 2 字节(将 char 转为 Unicode 码点,大端序) -
writeInt(int v)→ 写入 4 字节(大端序) -
writeLong(long v)→ 写入 8 字节(大端序) -
writeFloat(float v)→ 写入 4 字节(IEEE 754 单精度格式) -
writeDouble(double v)→ 写入 8 字节(IEEE 754 双精度格式) -
writeUTF(String s)→ 按 modified UTF-8 编码写入字符串(含 2 字节长度前缀)
典型使用示例(写入文件)
以下代码将多种基本类型写入 data.bin 文件:
try (DataOutputStream dos = new DataOutputStream(
new FileOutputStream("data.bin"))) {
dos.writeBoolean(true);
dos.writeByte(127);
dos.writeShort(30000);
dos.writeInt(123456789);
dos.writeLong(9876543210L);
dos.writeFloat(3.14f);
dos.writeDouble(2.71828);
dos.writeUTF("Hello 世界");
} catch (IOException e) {
e.printStackTrace();
}
执行后,文件中按顺序存放严格对齐的二进制数据,可被任意支持 Java DataInput 协议的程序准确解析。
立即学习“Java免费学习笔记(深入)”;
注意事项与常见问题
使用时需注意以下关键点:
- 务必用
try-with-resources或手动调用close(),否则缓冲区可能未刷新,导致数据丢失 -
writeUTF()不是标准 UTF-8:它用 2 字节存长度,且对\u0000–\u007F直接写单字节,\u0080–\u07FF编码为两字节,\u0800及以上用三字节;不兼容普通 UTF-8 解码器 - 所有
writeXxx()方法都可能抛出IOException,需捕获或声明 - 不支持直接写入对象(如
String以外的引用类型),需序列化或自行转换为基本类型/字节数组
配合 DataInputStream 读取(简要对照)
写入后,可用 DataInputStream 按**完全相同的顺序和类型**读回:
try (DataInputStream dis = new DataInputStream(
new FileInputStream("data.bin"))) {
System.out.println(dis.readBoolean()); // true
System.out.println(dis.readByte()); // 127
System.out.println(dis.readShort()); // 30000
System.out.println(dis.readInt()); // 123456789
System.out.println(dis.readLong()); // 9876543210
System.out.println(dis.readFloat()); // 3.14
System.out.println(dis.readDouble()); // 2.71828
System.out.println(dis.readUTF()); // "Hello 世界"
}
顺序错一位或类型不匹配(如用 readInt() 读 writeShort() 的位置),会导致数值错误或 EOFException。


















