DataInputStream和DataOutputStream是 Java的数据流,数据流是一个装饰流(处理流)。数据流在读取和写入时的顺序要一致。否则,读取的数据必定是错误的,会造成乱码。
数据流DataInputStream和DataOutputStream扩展了基本输入输出流读取基本数据类型和String类型数据的功能。数据流能以一种与平台无关的方式,直接从字节输入读取或向字节输出流写出Java基本类型和String类型的数据,常用于网络传输。
注意事项:
网络传输数据时要注意BOM【字节序标记】
什么是BOM(Byte Order Mark)【字节序标记】【大端BE】【小端LE】
在网络传输数据时,BOM【字节序标记】定义了数据传输的字节顺序:
DataInputStream 会根据当前平台的字节顺序来读取数据。通常,Java 使用的是BOM是大端BE(big-endian),但也有一些平台使用是小端LE(Little endian)小端字节顺序。可以使用 DataInputStream 的 readXXX() 方法来测试,以确保读取数据时使用正确的字节顺序。
数据输出流DataOutputStream
DataOutputStream继承自FilterOutputStream,而 FilterOutputStream 又继承了 OutputStream。数据输出流拥有基本数据类型的写入操作。其writeUTF(String text)方法可将字符串写入数据输出流。但它不能直接连接数据源,它只能用于装饰节点流。
DataOutputStream定义了各种数据类型的写入方法write()方法,用于写入 Java 基础数据类型的数据和String数据:
数据输入流DataInputStream
DataInputStream继承自FilterInputStream,而 FilterInputStream 又继承了 InputStream,该数据输入流拥有基本数据类型的数据读取操作。使用readUTF()方法可从数据输入流中读取字符串。
DataInputStream中定义了各种数据类型的读取方法read(),用于读取 Java 基础数据类型的数据和String型的数据:
下面是一个演示例程:
package file;
import java.io.*;
public class DataIOTest {
public static void main(String[] args) {
String path = "D:/src/tmp/testFile.txt";
try (DataOutputStream dos = new DataOutputStream(new FileOutputStream(new File(path)));
DataInputStream dis = new DataInputStream(new FileInputStream(new File(path)))) {
dos.writeInt(128);
dos.writeBoolean(true);
dos.writeDouble(3.1416);
dos.writeUTF("天佑中华!");
dos.flush();
int i = dis.readInt();
boolean flag = dis.readBoolean();
double d = dis.readDouble();
String tempUTF = dis.readUTF();
System.out.println(i+" : "+flag+" : "+d+" : "+tempUTF);
} catch (Exception e) {
e.printStackTrace();
}
}
}
参考资料: