Java中的ObjectOutputStream –将对象写入文件
Java中的ObjectOutputStream可用于将对象转换为OutputStream。
将对象转换为流的过程在Java中称为序列化。
将对象转换为输出流后,可以将其保存到文件或者数据库中,通过网络发送或者用于套接字连接。
因此,我们可以使用FileOutputStream将Object写入文件。
ObjectOutputStream
ObjectOutputStream是Java IO类的一部分,其整个目的是为我们提供一种将Java对象转换为流的方法。
创建ObjectOutputStream的实例时,我们必须提供要使用的OutputStream。
ObjectOutputStream进一步使用此OutputStream将对象流引导到基础输出流,例如FileOutputStream。
ObjectOutputStream要求
我们要序列化的对象应该实现java.io.Serializable接口。
可序列化只是一个标记接口,没有我们必须实现的任何抽象方法。
如果该类未实现Serializable接口,则将获得java.io.NotSerializableException。
异常堆栈跟踪下面的内容。
java.io.NotSerializableException: com.theitroad.files.EmployeeObject at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348) at com.theitroad.files.ObjectOutputStreamExample.main(ObjectOutputStreamExample.java:21)
Java ObjectOutputStream示例将对象写入文件
Le,t看一下java ObjectOutputStream示例,将一个对象写入文件。
首先,我们应该有一个带有某些属性的类。
让我们创建一个对象,将其保存到文件中。
package com.theitroad.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对象没有"名称"属性的getter/setter方法。
它也没有无参数的构造函数。
这是显示如何使用ObjectOutputStream在Java中将对象写入文件的程序。
package com.theitroad.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("hyman"); 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.theitroad.files.Employee�����yyIageLgendertLjava/lang/String;Lnameq~Lroleq~xp#tMalethymantCEO
具有瞬态的ObjectOutputStream
如果我们不希望将某些对象属性转换为流,则必须使用transient关键字。
例如,只需更改如下的role属性,就不会保存它。
private transient String role;
ObjectOutputStream和serialVersionUID
您是否注意到Employee对象中定义的" serialVersionUID"? " 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=hyman Age=35 Gender=Male Role=CEO"