Java 中的 ObjectOutputStream - 将对象写入文件
Java 中的 ObjectOutputStream 可用于将对象转换为 OutputStream。将对象转换为流的过程在 Java 中称为序列化。将对象转换为 Output Stream 后,可以将其保存到文件或数据库、通过网络发送或用于套接字连接。因此,我们可以使用 FileOutputStream 将对象写入文件。
对象输出流
ObjectOutputStream 是Java IO类的一部分,其全部目的是为我们提供一种将 Java 对象转换为流的方法。当我们创建 ObjectOutputStream 的实例时,我们必须提供要使用的 OutputStream。ObjectOutputStream 进一步使用此 OutputStream 将对象流引导到底层输出流,例如FileOutputStream。
ObjectOutputStream 要求
我们想要序列化的对象应该实现java.io.Serializable
接口。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 中的文件。
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();
}
}
}
下图显示了上述程序的输出。如果你想知道文件的内容是什么EmployeeObject.ser
,它有点混乱,如下所示。
��srcom.journaldev.files.Employee�����yyIageLgendertLjava/lang/String;Lnameq~Lroleq~xp#tMaletPankajtCEO
具有瞬时性的 ObjectOutputStream
如果我们不想将某些对象属性转换为流,则必须使用 temporary 关键字。例如,只需像下面这样更改角色属性,它就不会被保存。
private transient String role;
ObjectOutputStream 和 serialVersionUID
您是否注意到了serialVersionUID
Employee 对象中的定义?它被ObjectOutputStream
类ObjectInputStream
用于写入和读取对象操作。虽然这个字段不是强制性的,但您应该保留它。否则,每当您更改对早期序列化对象没有影响的类时,它就会开始失败。有关详细分析,请转到Java 中的序列化。如果您想知道我们的程序是否运行良好,请使用以下代码从保存的文件中读取对象。
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 的全部内容以及如何使用它将对象写入文件。
You can checkout more Java IO examples from our GitHub Repository.
Reference: API Doc