datainputstream 是必须包装底层 inputstream 的装饰器类,按大端格式读取基本类型和字符串,方法如 readint() 读4字节、readutf() 先读2字节长度再读utf字节,需严格匹配写入顺序且用 try-with-resources 关闭。

DataInputStream 是 Java 中用于从输入流中**按字节顺序读取 Java 基本数据类型(如 int、double、boolean 等)和字符串**的装饰器类。它必须包装一个已有的 InputStream(比如 FileInputStream 或 ByteArrayInputStream),不能独立创建。
核心要点:必须配合底层字节流使用
DataInputStream 本身不负责打开文件或建立连接,只负责“解释字节”。所以使用前必须先准备好一个原始字节流:
- 读文件 → 用
new FileInputStream("data.bin") - 读网络响应 → 用
socket.getInputStream() - 读内存字节数组 → 用
new ByteArrayInputStream(byteArray)
读取基本数据类型的常用方法
每个方法都严格按 Java 的大端(Big-Endian)格式读取对应字节数,且会阻塞直到读满所需字节或遇到 EOF:
-
readInt():读 4 字节 → 转为int(高位在前) -
readDouble():读 8 字节 → 转为double -
readBoolean():读 1 字节 → 0 为false,非 0 为true -
readChar():读 2 字节 → 转为char(UTF-16 大端) -
readUTF():读特殊编码的 UTF 字符串(先读 2 字节长度,再读对应 UTF 字节)
EOFException,不是返回 -1。
完整示例:写入再读取 int/double/boolean
先用 DataOutputStream 写入二进制数据,再用 DataInputStream 按相同顺序读取:
// 写入(保存为 data.bin)
try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.bin"))) {
dos.writeInt(12345);
dos.writeDouble(3.14159);
dos.writeBoolean(true);
}
// 读取(必须严格按写入顺序)
try (DataInputStream dis = new DataInputStream(new FileInputStream("data.bin"))) {
int i = dis.readInt(); // → 12345
double d = dis.readDouble(); // → 3.14159
boolean b = dis.readBoolean(); // → true
}
常见问题与建议
- 顺序必须严格一致:写什么类型、多少个、什么顺序,读就要完全一样,否则数据错位
-
不要混用 read() 和 readInt():
read()只读 1 字节,会破坏后续多字节读取的位置 - 关闭流:推荐用 try-with-resources 自动释放资源
-
中文字符串慎用 readUTF():它只支持 modified UTF-8(
\u0000编码为 2 字节),普通中文没问题;若需标准 UTF-8,改用readLine()+String.getBytes(StandardCharsets.UTF_8)配合InputStreamReader
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











