Java中DataInputStream和DataOutputStream用法详解
2023-10-07 18:24:38
掌握 Java 中的 DataInputStream 和 DataOutputStream:处理二进制数据的利器
简介
在 Java 的广阔世界中,DataInputStream
和 DataOutputStream
扮演着至关重要的角色,它们负责以二进制格式读取和写入数据。从网络通信到文件处理,它们是处理二进制数据不可或缺的利器。本指南将带领你踏上探索这些流类的精彩旅程,助你轻松驾驭 Java 中二进制数据的处理。
DataInputStream:从输入流中汲取数据
想象DataInputStream
就像一条通往二进制宝库的管道,它允许你从输入流中提取各种数据类型,包括基本数据类型(如整数、浮点数)、字符串和 UTF 编码字符。它的工作原理遵循大端序原则,这意味着高位字节会率先在低地址处存储。
常用方法:
- readBoolean(): 你好,真或假?读取一个布尔值。
- readByte(): 获取一个 8 位字节,范围从 -128 到 127。
- readShort(): 提取一个 16 位短整型,范围从 -32,768 到 32,767。
- readInt(): 读取一个 32 位整型,范围从 -2,147,483,648 到 2,147,483,647。
- readLong(): 获得一个 64 位长整型,范围从 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。
- readFloat(): 提取一个 32 位浮点数,它可以表示一个近似值,范围大约在 1.4E-45 到 3.4E38 之间。
- readDouble(): 获得一个 64 位双精度浮点数,它比浮点数提供了更高的精度,范围大约在 4.9E-324 到 1.7E308 之间。
- readUTF(): 读取一个 UTF 编码的字符串,它将字符串的长度作为前缀写入,然后依次写入 UTF 编码的字符。
示例:
// 从 data.bin 文件中读取二进制数据
try (DataInputStream in = new DataInputStream(new FileInputStream("data.bin"))) {
boolean boolValue = in.readBoolean();
byte byteValue = in.readByte();
int intValue = in.readInt();
String strValue = in.readUTF();
// 打印读取到的值
System.out.println("布尔值:" + boolValue);
System.out.println("字节值:" + byteValue);
System.out.println("整型值:" + intValue);
System.out.println("字符串值:" + strValue);
} catch (IOException e) {
e.printStackTrace();
}
DataOutputStream:向输出流中注入数据
现在,让我们把注意力转向DataOutputStream
,它就像一条输送管道,将数据从 Java 程序传输到输出流中。它也遵循大端序原则,这意味着高位字节将优先写入低地址处。
常用方法:
- writeBoolean(boolean): 写入一个布尔值,将 true 编码为 1,false 编码为 0。
- writeByte(int): 写入一个 8 位字节,范围从 -128 到 127。
- writeShort(int): 写入一个 16 位短整型,范围从 -32,768 到 32,767。
- writeInt(int): 写入一个 32 位整型,范围从 -2,147,483,648 到 2,147,483,647。
- writeLong(long): 写入一个 64 位长整型,范围从 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。
- writeFloat(float): 写入一个 32 位浮点数,它可以表示一个近似值,范围大约在 1.4E-45 到 3.4E38 之间。
- writeDouble(double): 写入一个 64 位双精度浮点数,它比浮点数提供了更高的精度,范围大约在 4.9E-324 到 1.7E308 之间。
- writeUTF(String): 写入一个 UTF 编码的字符串,它将字符串的长度作为前缀写入,然后依次写入 UTF 编码的字符。
示例:
// 将二进制数据写入 data.bin 文件
try (DataOutputStream out = new DataOutputStream(new FileOutputStream("data.bin"))) {
out.writeBoolean(true);
out.writeByte(127);
out.writeInt(123456789);
out.writeUTF("Hello World!");
// 刷新输出流以确保所有数据都被写入文件
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
使用注意事项
- 牢记输入和输出流的正确打开和关闭至关重要。
- 对于基本数据类型,Java 虚拟机可能会进行类型转换,具体取决于底层操作系统的字节顺序。
- UTF 编码的字符串将首先写入其长度,然后写入 UTF 编码的字符。
DataInputStream
和DataOutputStream
流不是线程安全的,在多线程环境中使用时需要同步机制。
常见问题解答
-
DataInputStream 和 DataOutputStream 有什么区别?
DataInputStream 从输入流中读取二进制数据,而 DataOutputStream 向输出流中写入二进制数据。 -
它们支持哪些数据类型?
它们支持基本数据类型(布尔值、字节、短整型、整型、长整型、浮点数和双精度浮点数)、字符串和 UTF 编码字符。 -
为什么使用大端序?
大端序使在不同平台上读取和写入二进制数据变得更加容易。 -
如何处理不同平台上的字节顺序差异?
Java 虚拟机可以处理字节顺序转换,具体取决于底层操作系统的字节顺序。 -
在什么时候使用 DataInputStream 和 DataOutputStream?
它们广泛用于网络通信、文件处理和数据序列化等场景。
总结
掌握DataInputStream
和DataOutputStream
的强大功能,你将成为 Java 二进制数据处理的超级英雄。牢记这些流的用法和注意事项,你就能自信地从输入流中提取数据并将其写入输出流中,为你的 Java 程序赋予强大的数据处理能力。