DataOutputStream属于字节流,因其继承FilterOutputStream并包装OutputStream,所有写入方法最终调用底层write()将基本类型按大端序转为字节序列,不处理字符编码。

在 Java 中,DataOutputStream 是字节流(属于 OutputStream 体系),但它能直接写入 Java 基本数据类型(如 int、double、boolean 等)和字符串,底层仍以字节形式存储,且遵循大端序(network byte order)。它**不是字符流**,不能替代 Writer 类处理编码问题;想写文本并控制字符编码,应配合 OutputStreamWriter 使用。
为什么 DataOutputStream 属于字节流?
DataOutputStream 继承自 FilterOutputStream,而后者包装的是 OutputStream —— 典型的字节输出流。它所有写入方法(如 writeInt()、writeUTF())最终都调用底层字节流的 write(),只是把基本类型按固定格式(如 int 占 4 字节、big-endian)转成字节序列再写出。因此:
- 它不关心字符编码,
writeUTF("你好")内部用修改版 UTF-8 编码(带长度前缀),不是标准平台默认编码; - 不能直接写入
char数组或String的原始字符(需用writeChars()或writeUTF()); - 与
FileOutputStream配合使用最常见,生成的是二进制文件,非文本文件(用记事本打开会乱码)。
常用基本类型写入方法及注意事项
以下方法均以大端序写入固定字节数,适合跨平台数据交换(如网络传输、二进制协议):
-
writeBoolean(boolean v)→ 写 1 字节(0x00 或 0x01) -
writeByte(int v)→ 写 1 字节(低 8 位) -
writeShort(int v)→ 写 2 字节(大端) -
writeChar(int v)→ 写 2 字节(Unicode 码点,大端) -
writeInt(int v)→ 写 4 字节(大端) -
writeLong(long v)→ 写 8 字节(大端) -
writeFloat(float v)→ 按 IEEE 754 写 4 字节 -
writeDouble(double v)→ 按 IEEE 754 写 8 字节 -
writeUTF(String s)→ 先写 2 字节长度(short),再写修改版 UTF-8 字节(支持中文,但长度上限 65535)
⚠️ 注意:writeChars(String s) 是逐个写入每个 char 的高字节+低字节(即每个字符写 2 字节,纯 Unicode 编码,不压缩,不推荐用于含中文的通用场景)。
立即学习“Java免费学习笔记(深入)”;
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
典型使用示例(写入到文件)
必须套在真正的字节输出流上(如 FileOutputStream),且建议显式关闭或使用 try-with-resources:
<font color="#888"><!-- 示例代码逻辑,非实际可运行 HTML --></font>
try (FileOutputStream fos = new FileOutputStream("data.bin");<br> DataOutputStream dos = new DataOutputStream(fos)) {<br> dos.writeBoolean(true);<br> dos.writeInt(123456);<br> dos.writeDouble(3.1415926);<br> dos.writeUTF("Hello 世界");<br>}
生成的 data.bin 是二进制文件。读取时必须用 DataInputStream,且读取顺序、类型必须与写入严格一致,否则会出错或得到错误值。
字符流场景下如何写基本类型?
如果目标是生成可读文本(如 CSV、日志),应使用字符流:
- 用
PrintWriter(字符流):支持print(int)、println(double)等,自动调用String.valueOf()转为字符串,并按指定编码写入; - 若需编码控制:搭配
OutputStreamWriter,例如new PrintWriter(new OutputStreamWriter(new FileOutputStream("log.txt"), "UTF-8")); -
DataOutputStream的writeBytes(String)方法不推荐——它只写字符串的低字节(类似 ISO-8859-1),中文会丢失。

















