在 Java 中,借助 Java 的 DataOutputStream 类,你不仅能向 OutputStream 写入字节,还可以写入 Java 基本数据类型。只需将 OutputStream 封装在 DataOutputStream 里,就能向其中写入各种基本数据类型。这也正是它被命名为 DataOutputStream 的缘由,因为你能够向 OutputStream 写入诸如 int、long、float 和 double 等类型的值,而非仅仅局限于原始字节。
注意,通常会将 DataOutputStream 与 DataInputStream 结合使用。使用 DataOutputStream 将数据写入文件等,然后再使用 DataInputStream 读取数据。
以下是一个 DataOutputStream 示例:
package com.hxstrive.java_io; import java.io.*; public class DataOutputStreamExample { public static void main(String[] args) throws IOException { // 写入数据到 DataOutputStream try (DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream("D:\\data.bin"))) { // 将基础类型数据写出到文件 dataOutputStream.writeInt(123); dataOutputStream.writeFloat(123.45F); dataOutputStream.writeLong(789); } } }
上面示例,先创建了一个 DataOutputStream,并将转换后的数据写入 FileOutputStream。
如前所述,DataInputStream 类经常与 DataOutputStream 类一起使用。下面举例说明先用 DataOutputStream 写入数据,然后再用 DataInputStream 读取数据。示例:
package com.hxstrive.java_io; import java.io.*; public class DataInputStreamExample2 { public static void main(String[] args) throws IOException { // 临时存放数据 ByteArrayOutputStream output = new ByteArrayOutputStream(); // 写入数据到 DataOutputStream try (DataOutputStream dataOutputStream = new DataOutputStream(output)) { dataOutputStream.writeInt(123); dataOutputStream.writeFloat(123.45F); dataOutputStream.writeLong(789); } // 使用 DataInputStream 读取 DataOutputStream 写出的数据 try(DataInputStream dataInputStream = new DataInputStream(new ByteArrayInputStream(output.toByteArray()))) { int int123 = dataInputStream.readInt(); float float12345 = dataInputStream.readFloat(); long long789 = dataInputStream.readLong(); System.out.println("int123 = " + int123); System.out.println("float12345 = " + float12345); System.out.println("long789 = " + long789); } } }
上述示例,首先创建 DataOutputStream 类,然后将 int、float 和 long 值写入 ByteArrayOutputStream,临时存放(当然,你也可以直接写入到某个文件)。其次,示例创建了一个 DataInputStream,从 ByteArrayOutputStream 返回的字节数组中读入 int、float 和 long 值。
当你完成向 DataOutputStream 写入数据的操作后,一定要记得将其关闭。
注意:关闭 DataOutputStream 时,它所写入的 OutputStream 实例也会随之关闭。
若要关闭 DataOutputStream,只需调用其 close() 方法即可。例如:
dataOutputStream.close();
您还可以使用 Java 7 中引入的 try-with-resources 结构。例如:
OutputStream output = new FileOutputStream("D:\\data.bin"); try(DataOutputStream dataOutputStream = new DataOutputStream(output)){ dataOutputStream.writeInt(123); dataOutputStream.writeFloat(123.45F); dataOutputStream.writeLong(789); }
需注意,此处不再有任何显式的 close() 方法调用,因为 try-with-resources 结构已自动处理了资源关闭问题。
另外,第一个 FileOutputStream 实例并非在 try-with-resources 代码块中创建,这就表明 try-with-resources 块不会自动关闭该 FileOutputStream 实例。不过,当关闭 DataOutputStream 时,它会同时关闭其写入数据的 OutputStream 实例,所以 FileOutputStream 实例会在 DataOutputStream 关闭时一并关闭。