DataInputStream 是 Java 中按固定格式读取二进制数据的工具类,要求数据必须由 DataOutputStream 写入;readInt() 以大端序读取 4 字节 int,readUTF() 读取含 2 字节长度前缀的修改版 UTF-8 字符串,不兼容标准 UTF-8。

DataInputStream 是 Java 中用于从输入流中按基本数据类型读取二进制数据的工具类,它封装了底层字节流(如 FileInputStream 或 ByteArrayInputStream),提供了一系列 readXxx() 方法,比如 readInt()、readUTF()、readLong() 等。这些方法按固定格式解析字节,**要求数据必须是用对应的 DataOutputStream 写入的**,否则会因字节顺序、编码或长度不匹配而抛出异常或读错值。
readInt():读取 4 字节有符号整数(big-endian)
该方法从流中连续读取 4 个字节,按大端序(network byte order)组装为一个 int 值。即高位字节在前,低位字节在后。
- 如果流中剩余字节不足 4 个,抛出
EOFException - 若底层流抛出
IOException(如断开连接),也会向上抛出 - 示例:写入时用
dos.writeInt(0x12345678),则读出就是0x12345678(十进制 305419896)
readUTF():读取 UTF-8 编码字符串(含长度前缀)
注意:这不是标准 UTF-8 读取,而是 Java 自定义格式 —— 先读 2 字节无符号短整型表示后续 UTF-8 字节数(最多 65535),再读对应字节数并按修改版 UTF-8 解码。
- 该格式兼容
DataOutputStream.writeUTF(),但和标准 UTF-8 不完全等价(例如空字符\u0000被编码为 2 字节0xC0 0x80) - 若前缀长度超出范围、字节流提前结束、或遇到非法修改版 UTF-8 序列,会抛出
UTFDataFormatException - 不能用来读普通文本文件或其它系统写的 UTF-8 字符串(除非对方也严格按 Java 的 writeUTF 规则写)
使用前提:数据必须由 DataOutputStream 写出
DataInputStream 的所有 readXxx() 方法都假设输入字节是按 Java 标准序列化规则组织的。常见误区包括:
立即学习“Java免费学习笔记(深入)”;
- 直接读取 C/C++ 写的二进制文件(字节序可能为小端,且无长度前缀)→ 应改用
ByteBuffer或手动解析 - 用
FileReader或普通InputStreamReader混合读取 → 会导致乱码或跳字节,因为字符解码会破坏原始二进制结构 - 未校验流是否可读/是否关闭 → 建议配合 try-with-resources 使用
典型安全用法示例
确保资源自动释放,并捕获常见异常:
try (DataInputStream dis = new DataInputStream(new FileInputStream("data.bin"))) {
int value = dis.readInt(); // 读 4 字节 int
long timestamp = dis.readLong(); // 读 8 字节 long
String name = dis.readUTF(); // 读带前缀的字符串
boolean flag = dis.readBoolean(); // 读 1 字节 boolean
} catch (EOFException e) {
// 数据提前结束,可能是文件损坏或写入不完整
} catch (IOException e) {
// IO 异常,如文件不存在、权限不足等
} catch (UTFDataFormatException e) {
// readUTF 解码失败,通常是数据不是用 writeUTF 写的
}
不复杂但容易忽略


















