Java ObjectOutputStream完全ガイド:シリアル化、メソッド、実践例
Java ObjectOutputStreamクラス
JavaのObjectOutputStream API、そのコアメソッド、オブジェクトをファイルにシリアル化して読み戻すステップバイステップ例を解説します。
java.ioパッケージのObjectOutputStreamクラスは、後でObjectInputStreamで読み取れるようにJavaオブジェクトを書き込みます。OutputStreamを拡張し、Javaの組み込みシリアル化メカニズムの要となっています。
ObjectOutputStreamの仕組み
ObjectOutputStreamにオブジェクトを書き込むと、フレームワークはオブジェクトのクラス名、フィールド値、型情報をバイナリ形式でエンコードします。このプロセスをシリアル化と呼びます。結果のバイトストリームはファイルに保存したり、ネットワーク経由で送信したり、メモリに埋め込んだりできます。
重要: java.io.Serializableを実装したオブジェクトのみシリアル化可能です。このインターフェースは、オブジェクトが持続または送信しても安全であることをランタイムに通知するマーカーとして機能します。
ObjectOutputStreamの作成
まずクラスをインポート:
import java.io.ObjectOutputStream;
次に、FileOutputStreamや他の基盤OutputStreamにリンク:
// "data.bin"というファイルに書き込み
FileOutputStream fileStream = new FileOutputStream("data.bin");
ObjectOutputStream objStream = new ObjectOutputStream(fileStream);
これでobjStreamはfileStreamにオブジェクトをシリアル化する準備が整いました。
ObjectOutputStreamの主要メソッド
クラスはOutputStreamからメソッド群を継承し、オブジェクト処理用の特殊メソッドを追加しています:
write(int b)– 1バイト書き込みwriteBoolean(boolean v)– boolean値書き込みwriteChar(int v)– 文字書き込みwriteInt(int v)– 整数書き込みwriteObject(Object obj)– 指定オブジェクトをシリアル化
例1:プリミティブとStringのシリアル化
intとStringをファイルに書き込み、ObjectInputStreamで読み戻す完全スニペット:
import java.io.*;
public class Main {
public static void main(String[] args) {
int data1 = 5;
String data2 = "This is programiz";
try {
// オブジェクト書き込み
FileOutputStream fos = new FileOutputStream("file.bin");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeInt(data1);
oos.writeObject(data2);
oos.close();
// オブジェクト読み取り
FileInputStream fis = new FileInputStream("file.bin");
ObjectInputStream ois = new ObjectInputStream(fis);
System.out.println("整数データ: " + ois.readInt());
System.out.println("文字列データ: " + ois.readObject());
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
出力
整数データ: 5 文字列データ: This is programiz
例2:カスタムオブジェクトのシリアル化
ユーザー定義クラスをシリアル化するには、単にSerializableを実装します:
import java.io.*;
class Dog implements Serializable {
String name;
String breed;
Dog(String name, String breed) {
this.name = name;
this.breed = breed;
}
}
public class Main {
public static void main(String[] args) {
Dog dog1 = new Dog("Tyson", "Labrador");
try {
// オブジェクト書き込み
FileOutputStream fos = new FileOutputStream("dog.bin");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(dog1);
oos.close();
// オブジェクト読み取り
FileInputStream fis = new FileInputStream("dog.bin");
ObjectInputStream ois = new ObjectInputStream(fis);
Dog newDog = (Dog) ois.readObject();
System.out.println("犬の名前: " + newDog.name);
System.out.println("犬の品種: " + newDog.breed);
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
出力
犬の名前: Tyson 犬の品種: Labrador
DogクラスはSerializableを実装する必要があります。なぜならObjectOutputStreamはシリアル化可能なオブジェクトのみ書き込めるからです。
ObjectOutputStreamのその他の操作
| メソッド | 説明 |
|---|---|
flush() | バッファされた出力バイトを基盤ストリームにフラッシュ |
drain() | バッファされたデータをフラッシュ(Java 9+で利用可能) |
close() | ストリームを閉じ、システムリソースを解放 |
詳細については公式Javaドキュメントを参照。
Java
- Javaのfinalキーワード完全解説:変数、メソッド、クラスでの活用法
- Java instanceof演算子完全ガイド:基本から継承・インターフェースまで
- Java継承のマスター:概念、種類、実践例
- Java Staticネストクラスの理解:用法、違い、実例
- Java無名インナークラス完全ガイド:定義、構文、実践例
- Javaシングルトンパターン完全解説:安全な実装と活用法
- Javaリフレクション完全ガイド:実行時のクラス・メソッド・フィールド検査
- Java ArrayList完全マスター:操作・メソッド・ベストプラクティス
- Java Stackクラス完全ガイド:使い方と主要メソッド
- Javaジェネリクス完全ガイド:再利用可能で型安全なコードの構築
- Javaファイル操作のマスター:java.ioによる作成・読み取り・書き込み・削除