DataInputStream 是 Java 中按大端序、机器无关方式读取基本数据类型的包装类,依赖底层输入流解析 DataOutputStream 写出的二进制数据,支持 readInt()、readDouble()、readUTF() 等方法,需确保格式匹配并妥善处理 IOException 和 EOFException。

DataInputStream 是 Java 中用于从输入流中**按字节顺序、以机器无关方式读取基本数据类型**的包装类。它内部依赖底层输入流(如 FileInputStream、ByteArrayInputStream 等),并严格按照 Java 的二进制格式(大端序、固定字节数)解析数据,适合读取由 DataOutputStream 写出的二进制文件或网络传输流。
读取基本数据类型的常用方法
每个基本类型都有对应的方法,调用时会自动读取所需字节数,并按规范转换:
- readBoolean():读 1 字节 → true(非零)或 false(0)
- readByte():读 1 字节 → byte(有符号)
- readShort():读 2 字节 → short(大端序,高位在前)
- readChar():读 2 字节 → char(大端序 Unicode 编码)
- readInt():读 4 字节 → int(大端序)
- readLong():读 8 字节 → long(大端序)
- readFloat():读 4 字节 → float(IEEE 754 单精度)
- readDouble():读 8 字节 → double(IEEE 754 双精度)
- readUTF():读 UTF-8 编码字符串(含 2 字节长度前缀)
使用前必须确保数据格式匹配
这些方法不校验数据来源,若底层流中的字节序列不符合 Java 二进制规范(比如不是 DataOutputStream 写出的),结果将不可预测:
- 读 readInt() 时,若只剩 2 字节,会抛出 EOFException
- 若字节顺序是小端(如某些 C 程序写入),Java 默认大端读取会导致数值错误
- readUTF() 要求前 2 字节是长度(大端),之后才是 UTF-8 字节;直接读普通字符串会失败
典型使用示例(配合 DataOutputStream 写入)
先写后读,保证格式一致:
立即学习“Java免费学习笔记(深入)”;
// 写入
try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.bin"))) {
dos.writeInt(12345);
dos.writeDouble(3.14159);
dos.writeUTF("Hello");
}
// 读取
try (DataInputStream dis = new DataInputStream(new FileInputStream("data.bin"))) {
int i = dis.readInt(); // → 12345
double d = dis.readDouble(); // → 3.14159
String s = dis.readUTF(); // → "Hello"
}
注意 close 和异常处理
务必关闭流(推荐 try-with-resources),否则资源泄露;所有读取方法都可能抛出 IOException(如断连、磁盘错误)或 EOFException(提前结束):
- 对不确定长度的数据,建议用 available() 判断可读字节数(但不完全可靠,尤其网络流)
- 更健壮的做法是捕获 EOFException 作为读取结束标志
- 不要用 read()(返回 int)去手动拼基本类型——容易出错且失去跨平台一致性


















