datainputstream 是装饰器,必须包装底层 inputstream 才能使用;读取时需严格按写入的类型、顺序和字节数调用对应 readxxx() 方法,全部采用大端序;推荐用 try-with-resources 确保资源自动释放。

DataInputStream 本身不直接读文件,它必须包装一个已打开的底层输入流(比如 FileInputStream 或 ByteArrayInputStream),然后按写入时约定的顺序和类型,逐个调用对应方法解析二进制字节。关键不是“怎么读”,而是“怎么对得上”——写入和读取的类型、顺序、字节数必须完全一致。
必须配合底层 InputStream 使用
DataInputStream 是装饰器,不能单独创建。常见组合方式:
- 读文件:new DataInputStream(new FileInputStream("data.bin"))
- 读内存字节数组:new DataInputStream(new ByteArrayInputStream(bytes))
- 读网络数据:new DataInputStream(socket.getInputStream())
按类型调用专用 readXxx() 方法
每种基本类型有固定字节数和解析规则,全部按大端序(Big-Endian)处理:
- readBoolean() → 读 1 字节(0x00 为 false,0x01 为 true)
- readByte() / readUnsignedByte() → 读 1 字节(有符号/无符号)
- readShort() / readUnsignedShort() → 读 2 字节,转为 short 或 int
- readChar() → 读 2 字节,按 UTF-16BE 解码为 char
- readInt() → 读 4 字节,转为 int
- readLong() → 读 8 字节,转为 long
- readFloat() → 读 4 字节,按 IEEE 754 解析
- readDouble() → 读 8 字节,按 IEEE 754 解析
- readUTF() → 先读 2 字节长度,再读对应字节数的 modified UTF-8 字符串
读取顺序必须与写入顺序严格一致
如果 DataOutputStream 写入顺序是:
writeBoolean(true); writeInt(12345); writeDouble(3.14159);
那么 DataInputStream 就必须按相同顺序调用:
- dis.readBoolean() → 得到 true
- dis.readInt() → 得到 12345
- dis.readDouble() → 得到 3.14159
一旦顺序错乱(例如先 readInt 再 readBoolean),后续所有读取都会偏移,结果不可预测,常抛 EOFException 或返回错误数值。
资源管理推荐用 try-with-resources
避免手动 close 出错或遗漏,让 JVM 自动释放流:
- try (DataInputStream dis = new DataInputStream(new FileInputStream("data.bin"))) { ... }
- 内部会自动调用 dis.close() 和底层 FileInputStream.close()
- 即使发生异常,也能确保流被关闭
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











