Java 菜鸟教程

Java 流程控制

Java 数组

Java 面向对象(I)

Java 面向对象(II)

Java 面向对象(III)

Java 异常处理

Java 列表(List)

Java Queue(队列)

Java Map集合

Java Set集合

Java 输入输出(I/O)

Java Reader/Writer

Java 其他主题

Java ObjectInputStream 类

在本教程中,我们将借助示例学习Java ObjectOutputStream及其方法。

java.io包的ObjectInputStream类可用于读取ObjectOutputStream先前编写的对象。

它进行了InputStream抽象类。

Java ObjectInputStream类是Java InputStream的子类。

在学习ObjectInputStream类之前,请确保您了解ObjectOutputStream类

ObjectInputStream的工作原理

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

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

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

创建一个ObjectInputStream

为了创建对象输入流,我们必须首先导入java.io.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;

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

        int data1 = 5;
        String data2 = "This is nhooo";

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

            //使用ObjectOutputStream写入文件
            output.writeInt(data1);
            output.writeObject(data2);

            FileInputStream fileStream = new FileInputStream("file.txt");
            //创建对象输入流
            ObjectInputStream objStream = new ObjectInputStream(fileStream);

            //使用readIng()方法
            System.out.println("整数数据 :" + objStream.readInt());

            //使用readObject()方法
            System.out.println("字符串数据: " + objStream.readObject());

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

输出结果

整数数据: 5
字符串数据: This is nhooo

在上面的示例中,我们使用了readInt()和readObject()方法从文件中读取整数数据和对象数据。

在这里,我们使用了ObjectOutputStream将数据写入文件。 然后,我们使用ObjectInputStream从文件中读取数据。

示例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;
    }
}

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

        //创建一个Dog类的对象
        Dog dog = new Dog("Tyson", "Labrador");

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

            //创建一个ObjectOutputStream
            ObjectOutputStream output = new ObjectOutputStream(file);

            //将对象写入输出流
            output.writeObject(dog);

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

            //创建一个ObjectInputStream
            ObjectInputStream input = new ObjectInputStream(fileStream);

            //读取对象
            Dog newDog = (Dog) input.readObject();

            System.out.println("狗的名字: " + newDog.name);
            System.out.println("犬种: " + newDog.breed);

            output.close();
            input.close();
        }

        catch (Exception e) {
            e.getStackTrace();
        }
    }
}

输出结果

狗的名字: Tyson
犬种: Labrador

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

  •  ObjectOutputStream使用名为file的FileOutputStream命名输出

  •  ObjectInputStream使用名为fileStream的FileInputStream命名输入

  • Dog类的对象dog

在这里,我们然后使用对象输出流将对象写入文件。并且,对象输入流从文件中读取对象。

注意:Dog类实现Serializable接口。这是因为ObjectOutputStream只将可序列化的对象写入输出流。

ObjectInputStream的其他方法

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