数据输入/输出流
数据输入/输出流(DataInputStream 类与 DataOutputStream 类)允许应用程序以与机器无关的方式从底层输入流中读取基本 Java 数据类型。也就是说,当读取一个数据时,不必再关心这个数值应当是哪种字节。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() 方法向目标设备中写入字符串的长度,因此也能准确地读回所写入的字符串。
【例15.6】使用数据流读写文本文件(实例位置:资源包\TM\sl\15\6)
分别通过 DataOutputStream 类的 writeUTF()、writeDouble()、writeInt() 和 writeBoolean() 方法向指定的 word.txt 文件中写入不同类型的数据,并通过 DataInputStream 类的相应方法将写入的数据输出到控制台上。
import java.io.*;
public class DataSteamDemo {
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());
// 读取double数据
System.out.println("readDouble方法读取数据:" + dis.readDouble());
// 读取int数据
System.out.println("readInt方法读取数据:" + dis.readInt());
// 读取boolean数据
System.out.println("readBoolean方法读取数据:" + dis.readBoolean());
dis.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果如下:
readUTF方法读取数据:使用writeUTF()方法写入数据
readDouble方法读取数据:19.8
readInt方法读取数据:298
readBoolean方法读取数据:true
使用记事本程序打开 word.txt 文件,如图15.9所示。尽管在记事本程序中看不出写入的字符串是 “使用writeUFT()方法写入数据”,但程序通过 readUTF() 方法读回后显示在屏幕上的仍是 “使用writeUFT()方法写入数据”。但如果使用 writeChars() 和 writeBytes() 方法写入字符串后,再读取回来就不容易了,读者不妨编写程序进行尝试。

编程训练(答案位置:资源包\TM\sl\15\编程训练)
【训练7】记录圆周率数值 将圆周率写入D盘根目录下的word.txt文件中,再将其读出并输出到控制台中(提示:Math.PI)。
【训练8】数字加密 随意定义一个整数数字,对该数字进行加密运算,并将加密结果写入文本文件中,然后将文本文件中的数字读取出来再解密还原。加密公式如下:
密文 = (原文 * 2 -11) * 3 + 17