Geekroid-ギークロイド(仮)|ITエンジニアの日常をささいな情報で彩るコラム

ITエンジニアの転職

ObjectInputStream/ObjectOutputStreamクラス

オブジェクトの保存 – ObjectInputStream/ObjectOutputStreamクラス
ObjectInputStream(InputStream in)
ObjectOutputStream(OutputStream out)
in:入力ストリーム
out:出力ストリーム

Javaでは、Objectをシリアライズすることで、バイトストリームに出力するための手段を備えています。#シリアライズ#とは、オブジェクトのような構造化データをファイル/ネットワーク経由でやり取りできるように、バイト配列に変換することを言います。シリアライズされたバイト配列を元のオブジェクトに戻すことをデシリアライズと言います。 そして、シリアライズ/デシリアライズのための機能を提供するのがObjectInputStream/ObjectOutputStreamクラスの役割です。以下に、主なメソッドをまとめます。

ObjectInputStream/ObjectOutputStreamクラスの主なメソッド
クラス メソッド 概要
ObjectInputStream int read([byte[] b [,int off, int len]]) 入力ストリームからバイト配列bに読み込み
(offは開始位置、lenは読み込み長)
T readXxxxx() データ型Tで入力ストリームから読み込み
long skip(long n) 読み込みをnバイトだけスキップ
void close() ストリームを閉じる
ObjectOutputStream void write(byte[] b [,int off, int len]) バイト配列bの内容を出力ストリームに書き出し
(offは開始位置、lenは読み込み長)
void writeXxxxx(T v) データ型Tで出力ストリームに書き込み
void close() ストリームを閉じる

以下は、オブジェクトPersonをファイルPerson.serに保存するためのサンプルです。また、Person.serを読み込み、その内容をオブジェクトとして復元しています。

StreamObject.java

package com.example.mynavi.stream;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class StreamObject {
  public static void main(String[] args) {
    String filename = "C:/data/Person.ser";
    try(ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filename));
      ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename))) {
      out.writeObject(new Person("山田太郎", 50));
      Person p = (Person) in.readObject();
      p.showInfo(); // 結果:「山田太郎」50歳
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

Person.java

package com.example.mynavi.stream;

import java.io.Serializable;

public class Person implements Serializable {

  private static final long serialVersionUID = -7053655917805742728L;
  public String name;
  public int age;
  public transient boolean deleted;

  Person(String name, int age) {
    this.name = name;
    this.age = age;
  }

  public void showInfo() {
    System.out.println("「" + this.name + "」" + this.age + "歳");
  }
}

ObjectInputStream/ObjectOutputStreamクラスでシリアライズ/デシリアライズする場合、対象となるクラス(ここではPerson)は以下の条件を満たしている必要があります。
・java.io.Serializableインターフェイス(※)を実装していること
・インスタンスフィールドは、基本型、またはSerializable実装型であること
・基底クラスがシリアライズ不可の場合、基底クラスが引数のないpublicコンストラクターを持っていること

※Serializableインターフェイスはシリアライズが可能であることを示すためだけのマーカーインターフェイスで、実装すべきメソッドは持ちません。

また、定数searialVersionUIDは、クラスのバージョンを管理するための情報です。この定数が用意されている場合、シリアライズ/デシリアライズ側で異なるバージョンのクラスを利用している時に、例外を発生させることができます。
データの読み書きには、データ型に応じてreadXxxxx/writeXxxxxメソッドを利用できます(Xxxxxはデータ型に応じてBoolean、Byte、Char、Doubleなど)。一般的なオブジェクトを利用する場合には、readObject/writeObjectメソッドを利用します。

ストリーム
ストリーム
FileInputStream/FileOutputStreamクラス
InputStreamReader/OutputStreamWriterクラス
BufferedReader/BufferedWriterクラス
ObjectInputStream/ObjectOutputStreamクラス
Fileクラス

Geekroid-ギークロイド(仮)|ITエンジニアの日常をささいな情報で彩るコラム

ITエンジニアの転職