JavaにおけるObjectOutputStream – オブジェクトをファイルに書き込む
JavaのObjectOutputStreamは、オブジェクトをOutputStreamに変換するために使用することができます。オブジェクトをストリームに変換するプロセスは、Javaではシリアライズと呼ばれています。オブジェクトがOutput Streamに変換されると、ファイルやデータベースに保存したり、ネットワーク上で送信したり、ソケット接続で使用することができます。そのため、FileOutputStreamを使用してオブジェクトをファイルに書き込むことができます。
オブジェクト出力ストリーム
ObjectOutputStreamはJava IOクラスの一部であり、その主な目的はJavaオブジェクトをストリームに変換する方法を提供することです。ObjectOutputStreamのインスタンスを作成する際には、使用するOutputStreamを指定する必要があります。このOutputStreamは、ObjectOutputStreamによってオブジェクトストリームを下位の出力ストリームにチャネルするためにさらに使用されます。例えば、FileOutputStreamなどです。
オブジェクトのシリアライズに使用するための ObjectOutputStream の要件
私たちがシリアライズしたいオブジェクトは、java.io.Serializable インターフェースを実装する必要があります。Serializable はマーカーインターフェースであり、実装する必要のある抽象メソッドはありません。クラスが Serializable インターフェースを実装していない場合、java.io.NotSerializableException が発生します。以下のような例外スタックトレースが表示されます。
java.io.NotSerializableException: com.scdev.files.EmployeeObject
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at com.scdev.files.ObjectOutputStreamExample.main(ObjectOutputStreamExample.java:21)
JavaのObjectOutputStreamの例を使ってオブジェクトをファイルに書き込む方法
JavaのObjectOutputStreamの例を見て、オブジェクトをファイルに書き込む方法を見てみましょう。そのためにまず、いくつかのプロパティを持つクラスが必要です。ファイルに保存するオブジェクトを作成してみましょう。
package com.scdev.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.scdev.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.scdev.files.Employee�����yyIageLgendertLjava/lang/String;Lnameq~Lroleq~xp#tMaletPankajtCEO
推進されたObjectOutputStream
もし私たちが特定のオブジェクトプロパティをストリームに変換したくない場合は、そのためにtransientキーワードを使用する必要があります。例えば、以下のように役割プロパティを変更するだけで保存されなくなります。
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=Pankaj Age=35 Gender=Male Role=CEO"
それがJavaのObjectOutputStreamについてのすべてであり、オブジェクトをファイルに書き込むためにどのように使用するかについてです。
私たちのGitHubリポジトリから、さらに多くのJava IOの例をチェックアウトすることができます。
参照:APIドキュメント