Java DataInputStream和DataOutputStream用法详解(附带实例)
数据输入/输出流(DataInputStream 类与 DataOutputStream 类)允许应用程序以与机器无关的方式从底层输入流中读取基本 Java 数据类型。也就是说,当读取一个数据时,不必再关心这个数值应当是哪种字节。
DataInputStream 类与 DataOutputStream 类的构造方法如下:
DataOutputStream 类提供了将字符串、double 数据、int 数据、boolean 数据写入文件中的方法。其中,将字符串写入文件中的方法有 3 种,分别是 writeBytes(String s)、writeChars(String s)、writeUTF(String s)。由于 Java 中的字符是 Unicode 编码的,并且是双字节的:
DataInputStream 类只提供了一个 readUTF() 方法返回字符串。这是因为要在一个连续的字节流中读取一个字符串,如果没有特殊的标记作为一个字符串的结尾,并且不知道这个字符串的长度,就无法知道读取到什么位置才是这个字符串的结束。
DataOutputStream 类中只有 writeUTF() 方法向目标设备中写入字符串的长度,因此也能准确地读回所写入的字符串。
【实例】使用数据流读写文本文件。分别通过 DataOutputStream 类的 writeUTF()、writeDouble()、writeInt() 和 writeBoolean() 方法向指定的 word.txt 文件中写入不同类型的数据,并通过 DataInputStream 类的相应方法将写入的数据输出到控制台上。
使用记事本程序打开 word.txt 文件,如下图所示:

图 1 word.txt文件中的内容
尽管在记事本程序中看不出写入的字符串是“使用writeUFT()方法写入数据”,但程序通过 readUTF() 方法读回后显示在屏幕上的仍是“使用writeUFT()方法写入数据”。但如果使用 writeChars() 和 writeBytes() 方法写入字符串后,再读取回来就不容易了,读者不妨编写程序进行尝试。
DataInputStream 类与 DataOutputStream 类的构造方法如下:
- DataInputStream(InputStream in):使用指定的基础 InputStream 对象创建一个 DataInputStream 对象;
- DataOutputStream(OutputStream out):创建一个新的数据输出流,将数据写入指定的基础输出流中。
DataOutputStream 类提供了将字符串、double 数据、int 数据、boolean 数据写入文件中的方法。其中,将字符串写入文件中的方法有 3 种,分别是 writeBytes(String s)、writeChars(String s)、writeUTF(String s)。由于 Java 中的字符是 Unicode 编码的,并且是双字节的:
- writeBytes() 方法只是将字符串中的每一个字符的低字节内容写入目标设备中;
- writeChars() 方法将字符串中的每一个字符的两个字节的内容都写入目标设备中;
- writeUTF() 方法将字符串按照 UTF 编码后的字节长度写入目标设备中,然后才是每一个字节的 UTF 编码。
DataInputStream 类只提供了一个 readUTF() 方法返回字符串。这是因为要在一个连续的字节流中读取一个字符串,如果没有特殊的标记作为一个字符串的结尾,并且不知道这个字符串的长度,就无法知道读取到什么位置才是这个字符串的结束。
DataOutputStream 类中只有 writeUTF() 方法向目标设备中写入字符串的长度,因此也能准确地读回所写入的字符串。
【实例】使用数据流读写文本文件。分别通过 DataOutputStream 类的 writeUTF()、writeDouble()、writeInt() 和 writeBoolean() 方法向指定的 word.txt 文件中写入不同类型的数据,并通过 DataInputStream 类的相应方法将写入的数据输出到控制台上。
import java.io.*; public class DataStreamDemo { public static void main(String[] args) { File file = new File("D:\\word.txt"); try { // 创建 FileOutputStream 对象,指定要向其中写入数据的文件 FileOutputStream fos = new FileOutputStream(file); // 创建 DataOutputStream 对象,用来向文件中写入数据 DataOutputStream dos = new DataOutputStream(fos); dos.writeUTF("使用 writeUTF()方法写入数据"); // 将字符串写入文件中 dos.writeDouble(19.8); // 将 double 数据写入文件中 dos.writeInt(298); // 将 int 数据写入文件中 dos.writeBoolean(true); // 将 boolean 数据写入文件中 dos.close(); fos.close(); // 创建 FileInputStream 对象,指定要从中读取数据的文件 FileInputStream fis = new FileInputStream(file); // 创建 DataInputStream 对象,用来从文件中读取数据 DataInputStream dis = new DataInputStream(fis); System.out.println("readUTF 方法读取数据:" + dis.readUTF()); // 读取字符串 System.out.println("readDouble 方法读取数据:" + dis.readDouble()); // 读取 double 数据 System.out.println("readInt 方法读取数据:" + dis.readInt()); // 读取 int 数据 System.out.println("readBoolean 方法读取数据:" + dis.readBoolean()); // 读取 boolean 数据 dis.close(); fis.close(); } catch (IOException e) { e.printStackTrace(); } } }运行结果如下:
readUTF方法读取数据:使用writeUTF()方法写入数据
readDouble方法读取数据:19.8
readInt方法读取数据:298
readBoolean方法读取数据:true
使用记事本程序打开 word.txt 文件,如下图所示:

图 1 word.txt文件中的内容
尽管在记事本程序中看不出写入的字符串是“使用writeUFT()方法写入数据”,但程序通过 readUTF() 方法读回后显示在屏幕上的仍是“使用writeUFT()方法写入数据”。但如果使用 writeChars() 和 writeBytes() 方法写入字符串后,再读取回来就不容易了,读者不妨编写程序进行尝试。