(每日持续更新)jdk api之DataOutputStream基础、应用、实战

发布时间:2024年01月11日

博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿,每天都会整理到12点,为了就是能让大家能够真正了解该技术栈的真正原理,最终从程序员成为一名真正的架构师,写的不一定是全站做好的,但是是全站最用心的~。

以后我会推出一些列的文章,每天都会更新,每天进步一点点,发布顺序【java的api基础、应用、实战】->【java开源技术栈及源码分析】->【java开源技术栈整合】->【java低代码开发平台的建设】

一、java.io

1.17 DataOutputStream

DataOutputStream 类是 Java 中实现了 DataOutput 接口的具体实现,用于将 Java 基本数据类型以二进制形式写入输出流。以下是关于 DataOutputStream 类的主要信息:

DataOutputStream 类介绍:
  • 包路径: java.io

DataOutputStream 类所有字段:

DataOutputStream 类没有定义任何字段。

DataOutputStream 类构造方法:
  • DataOutputStream(OutputStream out)

    • 构造一个新的 DataOutputStream,将数据写入指定的输出流 out

DataOutputStream 类方法摘要:

以下是 DataOutputStream 类中一些主要的方法,它们继承自 FilterOutputStream 类:

  1. void write(int b)

    • 将指定的字节写入输出流。

  2. void write(byte[] b, int off, int len)

    • 将字节数组的指定范围写入输出流。

  3. void writeBoolean(boolean v)

    • 将一个布尔值写入输出流。

  4. void writeByte(int v)

    • 将一个字节写入输出流。

  5. void writeShort(int v)

    • 将一个短整数写入输出流。

  6. void writeChar(int v)

    • 将一个字符写入输出流。

  7. void writeInt(int v)

    • 将一个整数写入输出流。

  8. void writeLong(long v)

    • 将一个长整数写入输出流。

  9. void writeFloat(float v)

    • 将一个单精度浮点数写入输出流。

  10. void writeDouble(double v)

    • 将一个双精度浮点数写入输出流。

  11. void writeBytes(String s)

    • 将字符串以字节数组形式写入输出流。

  12. void writeChars(String s)

    • 将字符串中的每个字符以字符形式写入输出流。

  13. void writeUTF(String s)

    • 使用修饰符长度前缀编码,将字符串写入输出流。

  14. void writeChars(CharSequence seq)

    • 将字符序列中的每个字符以字符形式写入输出流。

  15. void writeUTF(CharSequence seq)

    • 使用修饰符长度前缀编码,将字符序列写入输出流。

  16. void flush()

    • 刷新输出流。

  17. void close()

    • 关闭输出流,同时释放与此流关联的所有系统资源。

简单使用例子:

以下是一个简单的例子,演示了如何使用 DataOutputStream 将基本数据类型以二进制形式写入文件:

javaCopy code
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
?
public class DataOutputStreamExample {
?
 ?  public static void main(String[] args) {
 ? ? ?  try (DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream("output.dat"))) {
 ? ? ? ? ?  // 写入不同类型的数据
 ? ? ? ? ?  dataOutputStream.writeBoolean(true);
 ? ? ? ? ?  dataOutputStream.writeByte(42);
 ? ? ? ? ?  dataOutputStream.writeShort(12345);
 ? ? ? ? ?  dataOutputStream.writeInt(987654321);
 ? ? ? ? ?  dataOutputStream.writeLong(123456789012345L);
 ? ? ? ? ?  dataOutputStream.writeFloat(3.14f);
 ? ? ? ? ?  dataOutputStream.writeDouble(2.71828);
 ? ? ? ? ?  dataOutputStream.writeUTF("Hello, DataOutputStream!");
?
 ? ? ? ? ?  System.out.println("Data written to file: output.dat");
?
 ? ? ?  } catch (IOException e) {
 ? ? ? ? ?  e.printStackTrace();
 ? ? ?  }
 ?  }
}

在这个例子中,我们使用 DataOutputStream 包装一个 FileOutputStream,然后通过 DataOutput 接口的方法逐个写入不同类型的数据。这个例子创建了一个名为 "output.dat" 的二进制数据文件。

应用场景

DataOutputStream 主要用于将 Java 的基本数据类型以及字符串以二进制形式写入输出流。以下是一些 DataOutputStream 的应用场景:

  1. 文件持久化: 适用于将数据以二进制形式写入文件,以实现数据的持久化。这可以包括配置文件、日志文件等。

    javaCopy code
    try (DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream("data.dat"))) {
     ?  dataOutputStream.writeInt(42);
     ?  dataOutputStream.writeUTF("Hello, DataOutputStream!");
     ?  // 写入其他数据类型
    } catch (IOException e) {
     ?  e.printStackTrace();
    }
  2. 网络通信: 在网络通信中,DataOutputStream 可以用于将数据以二进制形式写入输出流,以便通过网络发送。

    javaCopy code
    try (DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream())) {
     ?  dataOutputStream.writeInt(42);
     ?  dataOutputStream.writeUTF("Hello, DataOutputStream!");
     ?  // 写入其他数据类型
    } catch (IOException e) {
     ?  e.printStackTrace();
    }
  3. 对象序列化: 在将对象序列化为字节数组时,DataOutputStream 可以用于将原始数据类型以二进制形式写入输出流。

    javaCopy code
    try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
     ? ? DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream)) {
    ?
     ?  dataOutputStream.writeInt(42);
     ?  dataOutputStream.writeUTF("Hello, DataOutputStream!");
     ?  // 写入其他数据类型
    ?
     ?  byte[] serializedData = byteArrayOutputStream.toByteArray();
     ?  // 将字节数组发送给其他地方进行反序列化
    } catch (IOException e) {
     ?  e.printStackTrace();
    }
  4. 数据格式化: 当需要以特定的格式将数据写入输出流时,DataOutputStream 可以提供一种简便的方式。

    javaCopy code
    try (DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream("formatted_data.dat"))) {
     ?  // 格式化写入数据
     ?  dataOutputStream.writeByte(1);
     ?  dataOutputStream.writeDouble(3.14);
     ?  dataOutputStream.writeChar('A');
     ?  // 写入其他格式化的数据
    } catch (IOException e) {
     ?  e.printStackTrace();
    }

总体而言,DataOutputStream 主要用于将原始数据类型以二进制形式写入输出流的场景,涵盖了文件操作、网络通信、对象序列化和数据格式化等多个应用领域。

实战例子

在实际项目中,DataOutputStream 可以用于将结构化数据以二进制形式写入文件,以实现数据的持久化。以下是一个简化的项目实战例子,假设有一个系统记录学生信息,包括学生姓名、年龄和成绩。我们使用 DataOutputStream 将学生信息以二进制形式写入文件。

首先,定义一个 Student 类表示学生信息:

javaCopy code
import java.io.Serializable;
?
public class Student implements Serializable {
 ?  private static final long serialVersionUID = 1L;
?
 ?  private String name;
 ?  private int age;
 ?  private double grade;
?
 ?  // 构造方法、Getter 和 Setter 等
?
 ?  // 省略其他业务逻辑
}

然后,创建一个学生数据写入器类,使用 DataOutputStream 将学生信息以二进制形式写入文件:

javaCopy code
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
?
public class StudentDataWriter {
?
 ?  public static void main(String[] args) {
 ? ? ?  // 模拟学生数据
 ? ? ?  List<Student> students = Arrays.asList(
 ? ? ? ? ? ? ?  new Student("Alice", 20, 85.5),
 ? ? ? ? ? ? ?  new Student("Bob", 22, 78.9),
 ? ? ? ? ? ? ?  new Student("Charlie", 21, 92.0)
 ? ? ?  );
?
 ? ? ?  // 写入学生数据到文件
 ? ? ?  writeStudentsToFile(students, "student_data.dat");
 ?  }
?
 ?  private static void writeStudentsToFile(List<Student> students, String fileName) {
 ? ? ?  try (DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream(fileName))) {
 ? ? ? ? ?  for (Student student : students) {
 ? ? ? ? ? ? ?  // 写入学生信息
 ? ? ? ? ? ? ?  dataOutputStream.writeUTF(student.getName());
 ? ? ? ? ? ? ?  dataOutputStream.writeInt(student.getAge());
 ? ? ? ? ? ? ?  dataOutputStream.writeDouble(student.getGrade());
 ? ? ? ? ?  }
?
 ? ? ? ? ?  System.out.println("Students written to file: " + fileName);
 ? ? ?  } catch (IOException e) {
 ? ? ? ? ?  e.printStackTrace();
 ? ? ?  }
 ?  }
}

在这个例子中,我们创建了三个学生对象,然后使用 DataOutputStream 将学生姓名、年龄和成绩以二进制形式写入到名为 "student_data.dat" 的文件中。这是一个简单的实战示例,实际项目中可能会涉及更多的业务逻辑和数据处理。

文章来源:https://blog.csdn.net/a89879193/article/details/135519120
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。