Javaオブジェクトをファイルに読み書きする方法
JavaオブジェクトSerializationは、Javaオブジェクトをシリアル化する手段としてJavaライブラリスタックによって提供されるAPIです。 シリアル化は、オブジェクトを書き込み可能なバイトストリームに変換するプロセスです。 これらのオブジェクトをバイトストリームに変換すると、ファイルに書き込むことができます。 この逆のプロセスは、逆シリアル化と呼ばれます。
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