ObjectOutputStream в Java — запись объекта в файл
ObjectOutputStream в Java можно использовать для преобразования объекта в OutputStream. Процесс преобразования объекта в поток называется сериализацией в Java. После преобразования объекта в выходной поток его можно сохранить в файл или базу данных, отправить по сети или использовать в соединениях сокетов. Таким образом, мы можем использовать FileOutputStream для записи объекта в файл.
ObjectOutputStream
ObjectOutputStream является частью 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;
}
}
Обратите внимание, что не обязательно иметь геттер/сеттер для всех свойств. Или иметь конструктор без аргументов. Как вы можете видеть, вышеприведенный объект Employee не имеет методов получения/установки для свойства \name. Он также не имеет конструктора без аргументов. Вот программа, показывающая, как записать объект в файл в java с использованием ObjectOutputStream .
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();
}
}
}
��srcom.journaldev.files.Employee�����yyIageLgendertLjava/lang/String;Lnameq~Lroleq~xp#tMaletPankajtCEO
ObjectOutputStream с переходным процессом
Если мы не хотим, чтобы какое-то свойство объекта преобразовывалось в поток, мы должны использовать для этого ключевое слово transient. Например, просто измените свойство роли, как показано ниже, и оно не будет сохранено.
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 и о том, как его использовать для записи объекта в файл.
Вы можете проверить больше примеров Java IO в нашем репозитории GitHub.
Ссылка: документ API