Java ObjectInputStream 类用法说明及实例

本教程通过示例介绍 Java ObjectInputStream 类以及使用方法。

本教程通过示例介绍 Java ObjectInputStream 类以及使用方法。

java.io 包的 ObjectInputStream 类可用于读取以前由 ObjectOutputStream 序列化的对象数据。

ObjectInputStream 类扩展了 InputStream 抽象类。

Java ObjectInputStream 类是 Java InputStream 的子类。
Java ObjectInputStream 类

在了解 ObjectInputStream 类之前,请先了解 ObjectOutputStream

ObjectInputStream 原理

ObjectInputStream 主要用于读取 ObjectOutputStream 写入的数据。

ObjectOutputStream 将 Java 对象转换为相应的流。这称为序列化。这些转换后的流可以存储在文件中或通过网络传输。

现在,如果我们需要读取这些对象,我们要使用 ObjectInputStream 将流转换回相应的对象。这称为反序列化。

创建 ObjectInputStream

我们可以通过以下方式创建对象输入流:

// 创建一个文件输入流关联到文件
FileInputStream fileStream = new FileInputStream(String file);

// 使用对象输入流包装文件输入流
ObjectInputStream objStream = new ObjectInputStream(fileStream);

在上面的例子中,我们创建了一个名为 objStream 的对象输入流, 它与名为 fileStream 的文件输入流关联。

现在, objStream 可以从文件中读取对象了。

ObjectInputStream 的方法

ObjectInputStream 类实现了的 InputStream 类中的定义的所有的抽象方法。

read() 方法

  • read() - 从输入流中读取一个字节的数据
  • readBoolean() - 以布尔形式读取数据
  • readChar() - 以字符形式读取数据
  • readInt() - 以整数形式读取数据
  • readObject() - 从输入流中读取对象

示例 1:Java ObjectInputStream

让我们看看如何使用 ObjectInputStream 该类来读取 ObjectOutputStream 类写入的对象。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class Main {
  public static void main(String[] args) {

    int data1 = 5;
    String data2 = "Hello World.";

    try {
      FileOutputStream file = new FileOutputStream("file.txt");
      ObjectOutputStream output = new ObjectOutputStream(file);

      // Writing to the file using ObjectOutputStream
      output.writeInt(data1);
      output.writeObject(data2);

      FileInputStream fileStream = new FileInputStream("file.txt");
      // Creating an object input stream
      ObjectInputStream objStream = new ObjectInputStream(fileStream);

      //Using the readInt() method
      System.out.println("Integer data : " + objStream.readInt());

      // Using the readObject() method
      System.out.println("String data: " + objStream.readObject());

      output.close();
      objStream.close();
    } catch (Exception e) {
      e.getStackTrace();
    }
  }
}

输出

Integer data : 5
String data: Hello World.

在上面的例子中,我们首先使用 ObjectOutputStream 将整数数据和对象数据写入文件,然后使用 ObjectInputStream 类的 readInt()readObject() 方法从文件中读取整数数据和对象数据。

示例 2:Java ObjectInputStream

让我们看另一个实际例子,

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

class Dog implements Serializable {

  String name;
  String breed;

  public Dog(String name, String breed) {
    this.name = name;
    this.breed = breed;
  }
}

public class Main {
  public static void main(String[] args) {

    // Creates an object of Dog class
    Dog dog = new Dog("Tyson", "Labrador");

    try {
      FileOutputStream file = new FileOutputStream("file.txt");

      // Creates an ObjectOutputStream
      ObjectOutputStream output = new ObjectOutputStream(file);

      // Writes objects to the output stream
      output.writeObject(dog);

      FileInputStream fileStream = new FileInputStream("file.txt");

      // Creates an ObjectInputStream
      ObjectInputStream input = new ObjectInputStream(fileStream);

      // Reads the objects
      Dog newDog = (Dog) input.readObject();

      System.out.println("Dog Name: " + newDog.name);
      System.out.println("Dog Breed: " + newDog.breed);

      output.close();
      input.close();
    } catch (Exception e) {
      e.getStackTrace();
    }
  }
}

输出

Dog Name: Tyson
Dog Breed: Labrador

在上面的例子中,我们创建了

  • 一个 Dog 对象
  • 一个 ObjectOutputStream 对象,它使用 FileOutputStream 对数据写入文件
  • 一个 ObjectInputStream 对象,它使用 FileInputStream 读取文件中的数据

! 注意Dog 类实现 Serializable 接口。这是因为 ObjectOutputStream 仅将可序列化 Serializable 接口的实现类。

ObjectInputStream 的其他方法

方法 说明
available() 返回输入流中的可用字节数
mark() 标记输入流中已读取数据的位置
reset() 将控制返回到输入流中设置标记的位置
skipBytes() 从输入流中跳过并丢弃指定的字节
close() 关闭对象输入流