返回

Java中DataInputStream和DataOutputStream用法详解

Android

掌握 Java 中的 DataInputStream 和 DataOutputStream:处理二进制数据的利器

简介

在 Java 的广阔世界中,DataInputStreamDataOutputStream 扮演着至关重要的角色,它们负责以二进制格式读取和写入数据。从网络通信到文件处理,它们是处理二进制数据不可或缺的利器。本指南将带领你踏上探索这些流类的精彩旅程,助你轻松驾驭 Java 中二进制数据的处理。

DataInputStream:从输入流中汲取数据

想象DataInputStream就像一条通往二进制宝库的管道,它允许你从输入流中提取各种数据类型,包括基本数据类型(如整数、浮点数)、字符串和 UTF 编码字符。它的工作原理遵循大端序原则,这意味着高位字节会率先在低地址处存储。

常用方法:

  • readBoolean(): 你好,真或假?读取一个布尔值。
  • readByte(): 获取一个 8 位字节,范围从 -128 到 127。
  • readShort(): 提取一个 16 位短整型,范围从 -32,768 到 32,767。
  • readInt(): 读取一个 32 位整型,范围从 -2,147,483,648 到 2,147,483,647。
  • readLong(): 获得一个 64 位长整型,范围从 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。
  • readFloat(): 提取一个 32 位浮点数,它可以表示一个近似值,范围大约在 1.4E-45 到 3.4E38 之间。
  • readDouble(): 获得一个 64 位双精度浮点数,它比浮点数提供了更高的精度,范围大约在 4.9E-324 到 1.7E308 之间。
  • readUTF(): 读取一个 UTF 编码的字符串,它将字符串的长度作为前缀写入,然后依次写入 UTF 编码的字符。

示例:

// 从 data.bin 文件中读取二进制数据
try (DataInputStream in = new DataInputStream(new FileInputStream("data.bin"))) {
    boolean boolValue = in.readBoolean();
    byte byteValue = in.readByte();
    int intValue = in.readInt();
    String strValue = in.readUTF();
    
    // 打印读取到的值
    System.out.println("布尔值:" + boolValue);
    System.out.println("字节值:" + byteValue);
    System.out.println("整型值:" + intValue);
    System.out.println("字符串值:" + strValue);
} catch (IOException e) {
    e.printStackTrace();
}

DataOutputStream:向输出流中注入数据

现在,让我们把注意力转向DataOutputStream,它就像一条输送管道,将数据从 Java 程序传输到输出流中。它也遵循大端序原则,这意味着高位字节将优先写入低地址处。

常用方法:

  • writeBoolean(boolean): 写入一个布尔值,将 true 编码为 1,false 编码为 0。
  • writeByte(int): 写入一个 8 位字节,范围从 -128 到 127。
  • writeShort(int): 写入一个 16 位短整型,范围从 -32,768 到 32,767。
  • writeInt(int): 写入一个 32 位整型,范围从 -2,147,483,648 到 2,147,483,647。
  • writeLong(long): 写入一个 64 位长整型,范围从 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。
  • writeFloat(float): 写入一个 32 位浮点数,它可以表示一个近似值,范围大约在 1.4E-45 到 3.4E38 之间。
  • writeDouble(double): 写入一个 64 位双精度浮点数,它比浮点数提供了更高的精度,范围大约在 4.9E-324 到 1.7E308 之间。
  • writeUTF(String): 写入一个 UTF 编码的字符串,它将字符串的长度作为前缀写入,然后依次写入 UTF 编码的字符。

示例:

// 将二进制数据写入 data.bin 文件
try (DataOutputStream out = new DataOutputStream(new FileOutputStream("data.bin"))) {
    out.writeBoolean(true);
    out.writeByte(127);
    out.writeInt(123456789);
    out.writeUTF("Hello World!");
    
    // 刷新输出流以确保所有数据都被写入文件
    out.flush();
} catch (IOException e) {
    e.printStackTrace();
}

使用注意事项

  • 牢记输入和输出流的正确打开和关闭至关重要。
  • 对于基本数据类型,Java 虚拟机可能会进行类型转换,具体取决于底层操作系统的字节顺序。
  • UTF 编码的字符串将首先写入其长度,然后写入 UTF 编码的字符。
  • DataInputStreamDataOutputStream 流不是线程安全的,在多线程环境中使用时需要同步机制。

常见问题解答

  1. DataInputStream 和 DataOutputStream 有什么区别?
    DataInputStream 从输入流中读取二进制数据,而 DataOutputStream 向输出流中写入二进制数据。

  2. 它们支持哪些数据类型?
    它们支持基本数据类型(布尔值、字节、短整型、整型、长整型、浮点数和双精度浮点数)、字符串和 UTF 编码字符。

  3. 为什么使用大端序?
    大端序使在不同平台上读取和写入二进制数据变得更加容易。

  4. 如何处理不同平台上的字节顺序差异?
    Java 虚拟机可以处理字节顺序转换,具体取决于底层操作系统的字节顺序。

  5. 在什么时候使用 DataInputStream 和 DataOutputStream?
    它们广泛用于网络通信、文件处理和数据序列化等场景。

总结

掌握DataInputStreamDataOutputStream的强大功能,你将成为 Java 二进制数据处理的超级英雄。牢记这些流的用法和注意事项,你就能自信地从输入流中提取数据并将其写入输出流中,为你的 Java 程序赋予强大的数据处理能力。