程序员社区

Java IO教程 --- Java 中的 ObjectOutputStream – 将对象写入文件

Java 中的 ObjectOutputStream 可用于将对象转换为 OutputStream。将对象转换为流的过程在 java 中称为序列化。

一旦一个对象被转换为输出流,它就可以保存到文件或数据库中,通过网络发送或在套接字连接中使用。所以我们可以使用 FileOutputStream 将 Object 写入文件。

对象输出流

ObjectOutputStream 是Java IO类的一部分,它的全部目的是为我们提供一种将 Java 对象转换为流的方法。当我们创建 ObjectOutputStream 的实例时,我们必须提供要使用的 OutputStream。ObjectOutputStream 进一步使用此 OutputStream 将对象流引导至底层输出流,例如FileOutputStream。

ObjectOutputStream 要求

我们要序列化的对象应该实现java.io.Serializable interface。Serializable 只是一个标记接口,没有任何我们必须实现的抽象方法。java.io.NotSerializableException如果该类没有实现 Serializable 接口,我们将得到。类似于下面的异常堆栈跟踪。

java.io.NotSerializableException: com.journaldev.files.EmployeeObject
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at com.journaldev.files.ObjectOutputStreamExample.main(ObjectOutputStreamExample.java:21)

将对象写入文件的 Java ObjectOutputStream 示例

让我们看一下 java ObjectOutputStream 示例,将对象写入文件。首先,我们应该有一个具有一些属性的类。

让我们创建一个我们将保存到文件中的对象。

package com.journaldev.files;

import java.io.Serializable;

public class Employee implements Serializable {

    private static final long serialVersionUID = -299482035708790407L;

    private String name;
    private String gender;
    private int age;

    private String role;
    // private transient String role;

    public Employee(String n) {
        this.name = n;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }

    @Override
    public String toString() {
        return "Employee:: Name=" + this.name + " Age=" + this.age + " Gender=" + this.gender + " Role=" + this.role;
    }

}

请注意,并非要求所有属性都具有 getter/setter。或者有一个无参数的构造函数。

如您所见,上面的 Employee 对象没有用于“name”属性的 getter/setter 方法。它也没有无参数构造函数。

这是显示如何使用 ObjectOutputStream 在 java 中将 Object 写入文件的程序。

package com.journaldev.files;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class ObjectOutputStreamExample {

    public static void main(String[] args) {
        Employee emp = new Employee("Pankaj");

        emp.setAge(35);
        emp.setGender("Male");
        emp.setRole("CEO");
        System.out.println(emp);

        try {
            FileOutputStream fos = new FileOutputStream("EmployeeObject.ser");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            // write object to file
            oos.writeObject(emp);
            System.out.println("Done");
            // closing resources
            oos.close();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

下图显示了上述程序的输出。

file

如果你想知道EmployeeObject.ser文件的内容是什么,它有点乱码,如下所示。

��srcom.journaldev.files.Employee�����yyIageLgendertLjava/lang/String;Lnameq~Lroleq~xp#tMaletPankajtCEO

具有瞬态的 ObjectOutputStream

如果我们不想将某些对象属性转换为流,我们必须为此使用瞬态关键字。例如,只需像下面这样更改角色属性,它就不会被保存。

private transient String role;

ObjectOutputStream 和 serialVersionUID

你注意到serialVersionUIDEmployee 对象中的定义了吗?它由ObjectOutputStreamObjectInputStream类用于写入和读取对象操作。虽然这个字段不是强制性的,但你应该保留它。否则,无论何时更改对早期序列化对象没有影响的类,它都会开始失败。

如果您想知道我们的程序是否运行良好,请使用以下代码从保存的文件中读取对象。

FileInputStream is = new FileInputStream("EmployeeObject.ser");
ObjectInputStream ois = new ObjectInputStream(is);
Employee emp = (Employee) ois.readObject();

ois.close();
is.close();
System.out.println(emp.toString());
//Output will be "Employee:: Name=Pankaj Age=35 Gender=Male Role=CEO"

这就是关于 java ObjectOutputStream 以及如何使用它将对象写入文件的全部内容。

赞(0) 打赏
未经允许不得转载:IDEA激活码 » Java IO教程 --- Java 中的 ObjectOutputStream – 将对象写入文件

一个分享Java & Python知识的社区