📜  Java IO 对象流字段(1)

📅  最后修改于: 2023-12-03 15:15:56.280000             🧑  作者: Mango

Java IO 对象流字段

Java IO 对象流(Field)是 Java IO 库中提供的一种特殊的流,可以将对象序列化为字节流并保存在文件中,也可以将字节流反序列化为对象。

对象流字段的概念

Java 中的对象流字段由 ObjectOutputStream 类和 ObjectInputStream 类提供。正如其名称所示,ObjectOutputStream 类可以将一个对象序列化为字节流并保存到文件中,而 ObjectInputStream 类可以将字节流反序列化为对象。

对象流字段主要用于在网络和磁盘等外部设备中存储对象和数据。Java 应用程序使用对象流字段可以将一个 Java 对象进行序列化,并将其存储到文件中。在需要时,程序可以读取文件并将序列化的流转换回 Java 对象。

使用对象流字段

要使用对象流字段将 Java 对象保存到文件中,请执行以下步骤:

  1. 创建一个 ObjectOutputSteam 类对象,并传递一个 FileOutputStream 类对象到其构造函数。
  2. 将 Java 对象写入 ObjectOutputSteam 类对象中。
  3. 关闭 ObjectOutputSteam 类对象。

反过来,将对象流反序列化为 Java 对象,请执行以下步骤:

  1. 创建一个 ObjectInputStream 类对象,并传递一个 FileInputStream 类对象到其构造函数。
  2. 读取 ObjectInputStream 类对象中的 Java 对象。
  3. 关闭 ObjectInputStream 类对象。

下面是一个简单的 Java 代码示例,用于将一个 Java 对象保存到文件中,并将其读取回来:

import java.io.*;

public class ObjectStreamExample {
    public static void main(String[] args) {
        // Serialize object to file
        try(ObjectOutputStream oos =
            new ObjectOutputStream(new FileOutputStream("test.dat"))) {
            Person person = new Person("Tom", 30);
            oos.writeObject(person);
        } catch(IOException ex) {
            System.err.println(ex);
        }

        // Deserialize object from file
        try(ObjectInputStream ois =
            new ObjectInputStream(new FileInputStream("test.dat"))) {
            Person person = (Person) ois.readObject();
            System.out.println(person);
        } catch(IOException | ClassNotFoundException ex) {
            System.err.println(ex);
        }
    }
}

class Person implements java.io.Serializable {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
对象流字段的注意事项

以下是一些需要注意的事项:

  • 要将一个 Java 对象序列化为字节流并将其写入文件中,对象必须实现 java.io.Serializable 接口。
  • 序列化的过程和读取序列化的对象需要使用同一个对象类型。
  • 当反序列化对象时,必须具有对象类的定义。
  • 如果一个类实现了 java.io.Externalizable 接口,那么它必须重写 writeExternal() 和 readExternal() 方法。通过这种方式,它可以控制序列化和反序列化过程中的操作。
常用的对象流字段方法

以下是 ObjectOutputStream 和 ObjectInputStream 类常用的方法:

ObjectOutputStream

| 方法 | 描述 | | ----------------- | ------------------------------------------------------------ | | writeObject(Object obj) | 将给定的对象写入 ObjectStream。需要注意的是,对象必须实现 java.io.Serializable 接口。 | | writeInt(int v) | 将一个 int 值写入 ObjectStream | | writeDouble(double v) | 将一个 double 值写入 ObjectStream | | writeChars(String s) | 将一个字符串写入 ObjectStream | | writeBytes(String s) | 将一个字节数组写入 ObjectStream |

ObjectInputStream

| 方法 | 描述 | | --------------------- | ------------------------------------------------------------ | | readObject() | 从 ObjectStream 中读取一个对象。需要注意的是,反序列化的过程和序列化的过程使用的是同一个对象类型 | | readInt() | 从 ObjectStream 中读取一个 int 值 | | readDouble() | 从 ObjectStream 中读取一个 double 值 | | readChar() | 从 ObjectStream 中读取一个字符值 | | readUTF() | 从 ObjectStream 中读取一个字符串值 | | readBoolean() | 从 ObjectStream 中读取一个布尔值 |

总结

Java IO 对象流字段提供了一种将 Java 对象序列化为字节流并将其保存到文件中的方法,也可以将字节流反序列化为 Java 对象。使用对象流字段,可以在网络和磁盘等外部设备中存储对象和数据。使用 ObjectOutputStream 和 ObjectInputStream 类,可以将 Java 对象写入文件并从文件中读取 Java 对象。需要注意的是,在序列化和反序列化过程中需要一些注意事项,例如对象必须实现 java.io.Serializable 接口。