DataInputStream 和 DataOutputStream 是包装底层字节流、按基本数据类型读写二进制数据的装饰流,支持 int/double/boolean/String 等类型,自动处理字节数与大端序,读写顺序必须严格一致。

DataInputStream 和 DataOutputStream 是 Java IO 中用于按基本数据类型(如 int、double、boolean 等)读写二进制数据的装饰流。它们不直接操作文件,而是包装在底层字节流(如 FileInputStream / FileOutputStream)之上,提供类型安全、平台无关的读写能力。
为什么要用 DataInputStream / DataOutputStream?
普通字节流(如 InputStream)只能按字节或字节数组读取,无法直接识别 int(4 字节)、double(8 字节)等语义。而这两个流会自动处理:
- 按固定字节数读写(如
writeInt()写 4 个字节,readInt()读 4 个字节) - 统一使用大端序(Big-Endian),保证跨平台一致性
- 支持全部 8 种基本类型 +
String(UTF 编码格式)
写入数据:用 DataOutputStream 包装 FileOutputStream
先创建 FileOutputStream,再用它构造 DataOutputStream,然后调用对应 writeXxx() 方法:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
<font color="#888">// 示例:写入一个 int、一个 double、一个 boolean 和一个字符串</font>
try (FileOutputStream fos = new FileOutputStream("data.bin");
DataOutputStream dos = new DataOutputStream(fos)) {
dos.writeInt(123); // 写入 4 字节 int
dos.writeDouble(3.14159); // 写入 8 字节 double
dos.writeBoolean(true); // 写入 1 字节 boolean
dos.writeUTF("Hello"); // 写入 UTF 编码字符串(含长度前缀)
} catch (IOException e) {
e.printStackTrace();
}
读取数据:用 DataInputStream 包装 FileInputStream
读取顺序必须与写入顺序严格一致,否则类型错位会导致异常或乱值:
立即学习“Java免费学习笔记(深入)”;
<font color="#888">// 按写入顺序依次读取</font>
try (FileInputStream fis = new FileInputStream("data.bin");
DataInputStream dis = new DataInputStream(fis)) {
int i = dis.readInt(); // 读 4 字节 → 123
double d = dis.readDouble(); // 读 8 字节 → 3.14159
boolean b = dis.readBoolean(); // 读 1 字节 → true
String s = dis.readUTF(); // 读 UTF 字符串 → "Hello"
System.out.println(i + ", " + d + ", " + b + ", " + s);
} catch (IOException e) {
e.printStackTrace();
}
注意事项和常见问题
-
顺序必须匹配:写入是 int→double→boolean→UTF,读取也必须按这个顺序,否则
readInt()可能读到 double 的前 4 字节,结果完全错误 -
readUTF() 与 writeUTF() 配对使用:它写入时会在字符串前加 2 字节长度(UTF 编码后字节数),所以不能用
readLine()或普通字节读取 -
不支持 null 字符串:对
null调用writeUTF()会抛NullPointerException -
关闭外层流即可:装饰流关闭时会自动关闭底层流,无需手动关
FileInputStream -
没有“跳过某字段”机制:如果只想读第 3 个字段,仍需按顺序读完前两个;如需随机访问,应考虑
RandomAccessFile

















