数据输入/输出流

数据输入/输出流(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() 方法写入字符串后,再读取回来就不容易了,读者不妨编写程序进行尝试。

image 2024 03 05 17 35 57 802
Figure 1. 图15.9 word.txt文件中的内容

编程训练(答案位置:资源包\TM\sl\15\编程训练)

【训练7】记录圆周率数值 将圆周率写入D盘根目录下的word.txt文件中,再将其读出并输出到控制台中(提示:Math.PI)。

【训练8】数字加密 随意定义一个整数数字,对该数字进行加密运算,并将加密结果写入文本文件中,然后将文本文件中的数字读取出来再解密还原。加密公式如下:

     密文 = (原文 * 2 -11) * 3 + 17