datainputstream 是基于字节流的增强型输入流,需包装 fileinputstream 等字节流,按固定规则(如 big-endian)将字节解析为 java 基本类型;必须与 dataoutputstream 配套使用以保证二进制格式一致;不可与 reader/writer 等字符流混用。

字节流是 DataInputStream 的基础
DataInputStream 不是独立存在的流,它必须包装一个字节输入流(如 FileInputStream 或 ByteArrayInputStream)才能工作。它本身不直接连接文件或数据源,而是对底层字节流做“增强”——在原始字节读取能力之上,提供按 int、long、double、boolean 等 Java 基本类型解析字节的逻辑。
关键点:DataInputStream 读取的仍是字节,但它按特定规则(如 big-endian、固定长度)把连续字节解释成对应类型值。例如:readInt() 会严格读取 4 个字节,并按高位在前方式组装为 int;readUTF() 则先读 2 字节长度,再读指定数量字节并按 UTF-8 解码为字符串。
必须用 DataOutputStream 配套写入
DataInputStream 能正确读出基本类型,前提是这些数据由 DataOutputStream 写入。两者使用完全一致的二进制格式规范(JDK 标准),否则会出现乱码、截断或 EOFException。
- 写入时用
DataOutputStream.writeDouble(3.1415),读取时才可用DataInputStream.readDouble() - 不能用
FileOutputStream.write(byte[])手动拼接 double 的字节,除非你手动实现 IEEE 754 编码逻辑 - 文本内容若需保留编码语义(如中文),应优先用
writeUTF()/readUTF(),而非普通字节写入
典型使用流程(带异常与资源管理)
以下是一个安全、完整的示例:先写入一组混合类型数据,再逐个读回。
// 写入阶段
try (DataOutputStream dos = new DataOutputStream(
new FileOutputStream("data.dat"))) {
dos.writeUTF("Hello 世界");
dos.writeInt(123);
dos.writeDouble(99.99);
dos.writeBoolean(true);
}
// 读取阶段(顺序、类型、数量必须严格匹配写入)
try (DataInputStream dis = new DataInputStream(
new FileInputStream("data.dat"))) {
String s = dis.readUTF(); // "Hello 世界"
int i = dis.readInt(); // 123
double d = dis.readDouble(); // 99.99
boolean b = dis.readBoolean(); // true
}
注意字符流不能直接配合 DataInputStream
Reader/Writer 是字符流,处理的是解码后的 char 序列,而 DataInputStream 操作的是原始字节序列。二者不可混用:
- 不能把 FileReader 包装进 DataInputStream —— 编译不通过(类型不兼容)
- 不能用 InputStreamReader 读取后转成字节数组再喂给 DataInputStream —— 会破坏原始二进制结构(如编码转换导致字节错位)
- 若需处理含文本+结构化数据的文件,建议统一用字节流体系:用 DataInputStream/DataOutputStream,文本部分走
writeUTF()/readUTF()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











