Как читать и записывать объект Java в файл
Объект JavaSerialization - это API, предоставляемый стеком библиотеки Java как средство сериализации объектов Java. Сериализация - это процесс преобразования объектов в поток байтов, доступный для записи. После преобразования в байтовый поток эти объекты могут быть записаны в файл. Обратный процесс называется десериализацией.
Объект Java является сериализуемым, если его класс или любой из его суперклассов реализуют либо интерфейсjava.io.Serializable
, либо его подынтерфейс,java.io.Externalizable
.
1. Java объект
Person.java
package com.example; import java.io.Serializable; public class Person implements Serializable { private static final long serialVersionUID = 1L; private String name; private int age; private String gender; Person() { }; Person(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } @Override public String toString() { return "Name:" + name + "\nAge: " + age + "\nGender: " + gender; } }
2. Написание и чтение объектов на Java
Объекты могут быть преобразованы в байтовый поток с помощьюjava.io.ObjectOutputStream
. Чтобы разрешить запись объектов в файл с помощьюObjectOutputStream
, необходимо, чтобы соответствующий класс реализовал интерфейсSerializable
, как показано в определении класса ниже.
Чтение объектов в Java похоже на запись объекта с использованиемObjectOutputStreamObjectInputStream
. Ниже приведен пример полного цикла написания объектов и чтения объектов на Java.
При чтении объектовObjectInputStream
напрямую пытается отобразить все атрибуты в класс, в который мы пытаемся привести объект чтения. Если не удается точно сопоставить соответствующий объект, возникает исключениеClassNotFound
.
Давайте теперь поймем процесс написания и чтения на примере. Мы используем классPerson
, показанный выше, как объект.
WriterReader.java
package com.example; package com.example; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class WriterReader { public static void main(String[] args) { Person p1 = new Person("John", 30, "Male"); Person p2 = new Person("Rachel", 25, "Female"); try { FileOutputStream f = new FileOutputStream(new File("myObjects.txt")); ObjectOutputStream o = new ObjectOutputStream(f); // Write objects to file o.writeObject(p1); o.writeObject(p2); o.close(); f.close(); FileInputStream fi = new FileInputStream(new File("myObjects.txt")); ObjectInputStream oi = new ObjectInputStream(fi); // Read objects Person pr1 = (Person) oi.readObject(); Person pr2 = (Person) oi.readObject(); System.out.println(pr1.toString()); System.out.println(pr2.toString()); oi.close(); fi.close(); } catch (FileNotFoundException e) { System.out.println("File not found"); } catch (IOException e) { System.out.println("Error initializing stream"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
Выполнив приведенный выше код, мы получим вывод ниже:
Name:John Age: 30 Gender: Male Name:Rachel Age: 25 Gender: Female