DataInputStream 是用于按字节顺序读取 Java 基本数据类型的装饰器类,需包装底层流后调用对应方法(如 readInt、readUTF),并注意读写顺序一致、异常处理及资源关闭。

DataInputStream 是 Java 中用于从输入流中按字节顺序读取 Java 基本数据类型(如 int、double、boolean 等)的装饰器类。它保证了平台无关的数据读取方式,特别适合读取由 DataOutputStream 写入的二进制数据。
使用 DataInputStream 读取基本数据类型的步骤
1. 创建一个底层输入流(如 FileInputStream、ByteArrayInputStream 或网络 Socket.getInputStream())
2. 将其包装为 DataInputStream
3. 调用对应方法(如 readInt()、readUTF()、readDouble())读取数据
4. 注意处理 IOException,并确保流在使用后关闭(推荐 try-with-resources)
常用读取方法及注意事项
DataInputStream 提供了与 Java 基本类型一一对应的读取方法:
-
readBoolean():读取 1 字节,0 →false,非 0 →true -
readByte():读取 1 字节,返回byte -
readShort():读取 2 字节,按大端序(Big-Endian)组装为short -
readChar():读取 2 字节,转为char(Unicode,大端) -
readInt():读取 4 字节,大端序转为int -
readLong():读取 8 字节,大端序转为long -
readFloat():读取 4 字节,按 IEEE 754 格式解析为float -
readDouble():读取 8 字节,按 IEEE 754 解析为double -
readUTF():读取 UTF-8 编码的字符串(含长度前缀,适用于DataOutputStream.writeUTF()写出的数据)
⚠️ 注意:readUTF() 不等价于 readLine() 或普通字符串读取;它专用于读取由 writeUTF() 写出的、带 2 字节长度头的修改版 UTF-8 字符串。
完整示例:读取 int、double 和字符串
假设有一个文件 data.bin 是用 DataOutputStream 写入的:
立即学习“Java免费学习笔记(深入)”;
// 写入示例(供参考)
try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.bin"))) {
dos.writeInt(12345);
dos.writeDouble(3.1415926);
dos.writeUTF("Hello 世界");
}
对应读取代码:
try (DataInputStream dis = new DataInputStream(new FileInputStream("data.bin"))) {
int num = dis.readInt(); // → 12345
double pi = dis.readDouble(); // → 3.1415926
String msg = dis.readUTF(); // → "Hello 世界"
System.out.println(num + ", " + pi + ", " + msg);
} catch (IOException e) {
e.printStackTrace();
}
常见问题提醒
- 如果流末尾数据不足(例如只剩 3 字节却调用
readInt()),会抛出EOFException - 读取顺序必须与写入顺序严格一致,否则类型错位(如把
int当作double读会导致乱码或异常) - 不建议用
DataInputStream读取文本行(如日志、配置),应改用BufferedReader;它的设计目标是二进制协议交互 - 若需读取变长原始字节,可用
readFully(byte[])或read(byte[]),再配合其他逻辑解析


















