Java プラットフォーム 1.2

java.io
クラス ObjectOutputStream

java.lang.Object
  |
  +--java.io.OutputStream
        |
        +--java.io.ObjectOutputStream

public class ObjectOutputStream
extends OutputStream
implements ObjectOutput, ObjectStreamConstants

Java の基本データ型とオブジェクトグラフを OutputStream に書き込みます。これらのオブジェクトを読み込む (再構築する) には ObjectInputStream を使います。オブジェクトの持続的記憶は、そのストリームのためのファイルを使えば可能です。ストリームがネットワークソケットストリームの場合は、ほかのホストやほかのプロセス上でオブジェクトを再構築することもできます。

ストリームに書き込めるのは java.io.Serializable インタフェースをサポートするオブジェクトだけです。 各直列化可能オブジェクトのクラスは、クラスの名前とシグニチャー、オブジェクトのフィールドと配列、および初期オブジェクトから参照されるほかのすべてのオブジェクトのクロージャを含めてコード化されます。

オブジェクトをストリームに書き込むには writeObject メソッドを使います。String や配列を含む任意のオブジェクトが writeObject によって書き込まれます。複数のオブジェクトやプリミティブも、ストリームへの書き込みが可能です。オブジェクトを読み込むときは、対応する ObjectInputstream から同じ型として、かつ書き込まれたときと同じ順序で読み込まなければなりません。

基本データ型をストリームに書き込むには、DataOutput の適切なメソッドを使います。String を書き込む場合は writeUTF メソッドを使います。

オブジェクトのデフォルトの直列化機構は、クラスのオブジェクト、クラスのシグニチャー、およびすべての非 transient と非 static フィールドの持つ値を書き込みます。ほかのオブジェクトへの参照 (transient と static フィールドは除く) があれば、これらのオブジェクトもやはり書き込まれます。単一オブジェクトへの多重参照は参照共有機構によりコード化され、オブジェクトグラフを、オリジナルが書き込まれたときの形状に復元することができます。

たとえば、ObjectInputStream の例で読み込めるようにオブジェクトを書き込むには、次のようにします。

	FileOutputStream ostream = new FileOutputStream("t.tmp");
	ObjectOutputStream p = new ObjectOutputStream(ostream);

	p.writeInt(12345);
	p.writeObject("Today");
	p.writeObject(new Date());

	p.flush();
	ostream.close();

 
直列化と直列化復元で特別な処理を必要とするクラスは、厳密なシグニチャーを持つ特別なクラスを実装しなければなりません。

 private void readObject(java.io.ObjectInputStream stream)
     throws IOException, ClassNotFoundException;
 private void writeObject(java.io.ObjectOutputStream stream)
     throws IOException
 

writeObject メソッドは、対応する readObject がオブジェクトの状態を復元することができるように、オブジェクトの特定のクラスについて、オブジェクトの状態を書き込む責任があります。このメソッドは、オブジェクトのスーパークラスやサブクラスに属する状態に関与する必要はありません。状態を保存するには、個々のフィールドについて writeObject メソッドを使って ObjectOutputStream に書き込むか、または DataOutput がサポートする基本データ型用のメソッドを使用します。

直列化は、java.io.Serializable インタフェースを実装しないオブジェクトのフィールドの書き込みは行いません。直列化可能でないオブジェクトのサブクラスを直列化可能にすることは可能です。この場合、直列化可能でないクラスは、そのフィールドを初期化できるようにするため、引数なしのコンストラクタを持つ必要があります。この場合、直列化可能でないクラスの状態を保存および再構築するのは、サブクラスの責任になります。そのクラスのフィールドがアクセス可能である (public、package、または protected) か、または状態を再構築するために使える get と set メソッドが存在する場合がしばしばあります。

writeObject と readObject メソッドで NotSerializableException をスローするように実装しておくと、オブジェクトの直列化を防止できます。例外は、ObjectOutputStream にキャッチされ、直列化処理を異常終了させます。 Externalizable インターフェースを実装すると、オブジェクトの直列化された形式の内容および形式をオブジェクト側が完全に制御することが可能になります。Externalizable インターフェースのメソッドである writeExternal と readExternal は、オブジェクトの状態を保存および復元するために呼び出されます。これらのメソッドは、クラスによって実装された場合には、ObjectOutput と ObjectInput のすべてのメソッドを使って、自身の状態の書き込みおよび読み込みを行うことができます。どのようなバージョンであっても処理できるようにするのは、オブジェクトの責任です。 直列化可能フィールドおよび外部化可能データを除くプリミティブデータは、ブロックデータレコードとして ObjectOutputStream に書き込まれます。ブロックデータレコードは、ヘッダとデータで構成されます。ブロックデータのヘッダは、マーカおよびヘッダに続くバイト数で構成されます。連続するプリミティブデータの書き込みは、1 つのブロックデータレコードにマージされます。 (*) ブロックデータレコードに使用されるブロック係数は 1024 バイトです。 (*) 各ブロックデータレコードは、1024 バイトまで埋め込まれるか、ブロックデータモードの終了まで書き込まれます。 ObjectOutputStream のメソッド writeObject、defaultWriteObject、および writeFields を呼び出すと、最初に既存のブロックデータレコードが終了されます。

導入されたバージョン:
JDK1.1
関連項目:
DataOutput, ObjectInputStream, Serializable, Externalizable, Java オブジェクト直列化仕様の第 2 章 オブジェクト出力クラス

内部クラスの概要
static class ObjectOutputStream.PutField
          ObjectOutput に書き込まれる持続フィールドへのプログラムによるアクセスを提供します。
 
コンストラクタの概要
protected ObjectOutputStream()
          ObjectOutputStream を完全に実装し直すサブクラスが、ObjectOutputStream のこの実装によって使用されたばかりの private データを割り当てる必要がないようにする手段を提供します。
  ObjectOutputStream(OutputStream out)
          指定された OutputStream に書き込む ObjectOutputStream を作成します。
 
メソッドの概要
protected  void annotateClass(Class cl)
          サブクラスは、クラスのデータをストリームに保存できるようにこのメソッドを実装する場合があります。
 void close()
          ストリームを閉じます。
 void defaultWriteObject()
          現在のクラスの非 static フィールドと非 transient フィールドを、ストリームに書き込みます。
protected  void drain()
          ObjectOutputStream にあるバッファデータをすべて空にします。
protected  boolean enableReplaceObject(boolean enable)
          ストリームのオブジェクトを置換できるようにします。
 void flush()
          ストリームをフラッシュします。
 ObjectOutputStream.PutField putFields()
          ストリームに書き込まれる持続フィールドをバッファに格納するために使用されるオブジェクトを取得します。
protected  Object replaceObject(Object obj)
          直列化の際に、ObjectOutputStream の信頼できるサブクラスが、あるオブジェクトをほかのオブジェクトに置換できるようにします。
 void reset()
          ストリームにすでに書き込まれているオブジェクトの状態を無効にします。
 void useProtocolVersion(int version)
          ストリームの書き込み時に使用するストリームプロトコルのバージョンを指定します。
 void write(byte[] b)
          バイト配列を書き込みます。
 void write(byte[] b, int off, int len)
          バイト配列の一部を書き込みます。
 void write(int data)
          データのバイトを書き込みます。
 void writeBoolean(boolean data)
          boolean を書き込みます。
 void writeByte(int data)
          8 ビットのバイトを書き込みます。
 void writeBytes(String data)
          String をバイトの列として書き込みます
 void writeChar(int data)
          16 ビットの char を書き込みます。
 void writeChars(String data)
          String を char の列として書き込みます。
 void writeDouble(double data)
          64 ビットの double を書き込みます。
 void writeFields()
          バッファに格納されたフィールドをストリームに書き込みます。
 void writeFloat(float data)
          32 ビットの float を書き込みます。
 void writeInt(int data)
          32 ビットの int を書き込みます。
 void writeLong(long data)
          64 ビットの long を書き込みます。
 void writeObject(Object obj)
          指定されたオブジェクトを ObjectOutputStream に書き込みます。
protected  void writeObjectOverride(Object obj)
          引数なしの protected コンストラクタを使用して ObjectInputStream を作成した ObjectInputStream の信頼できるサブクラスによって呼び出されます。
 void writeShort(int data)
          16 ビットの short を書き込みます。
protected  void writeStreamHeader()
          サブクラスが自身のヘッダをストリームの前または後ろに追加できるように提供されています。
 void writeUTF(String data)
          この String のプリミティブデータを UTF 形式で書き込みます。
 
クラス java.lang.Object から継承したメソッド
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

コンストラクタの詳細

ObjectOutputStream

public ObjectOutputStream(OutputStream out)
                   throws IOException
指定された OutputStream に書き込む ObjectOutputStream を作成します。ストリームにストリームヘッダが書き込まれます。呼び出し側は、対応する ObjectInputStream がただちにヘッダを読み込めるように flush を呼び出す場合があります。
例外:
IOException - 基礎の OutputStream に例外が発生した場合

ObjectOutputStream

protected ObjectOutputStream()
                      throws IOException,
                             SecurityException
ObjectOutputStream を完全に実装し直すサブクラスが、ObjectOutputStream のこの実装によって使用されたばかりの private データを割り当てる必要がないようにする手段を提供します。

セキュリティマネージャがインストールされている場合、このメソッドは、まずセキュリティマネージャの checkPermission メソッドをアクセス権 SerializablePermission("enableSubclassImplementation") で呼び出し、サブクラス化を有効にできるようにします。

例外:
IOException - サブクラスによって呼び出されなかった場合
SecurityException - セキュリティマネージャが存在し、その checkPermission メソッドがサブクラス化を有効にすることを拒否した場合
関連項目:
SecurityManager.checkPermission(java.security.Permission), java.security.SerializablePermission
メソッドの詳細

writeObjectOverride

protected void writeObjectOverride(Object obj)
                            throws IOException
引数なしの protected コンストラクタを使用して ObjectInputStream を作成した ObjectInputStream の信頼できるサブクラスによって呼び出されます。サブクラスは、修飾子が final のオーバーライドメソッドを提供すると見なされます。
導入されたバージョン:
JDK 1.2
関連項目:
ObjectOutputStream(), writeObject(Object)

useProtocolVersion

public void useProtocolVersion(int version)
                        throws IOException
ストリームの書き込み時に使用するストリームプロトコルのバージョンを指定します。

このルーチンは、現在のバージョンの直列化が、前のバージョンのストリーム形式と下位互換性のある形式で書き込めるようにするフックを提供します。

下位互換性のない形式がさらに導入されるのを防ぐためにあらゆる努力が行われますが、選択の余地のない場合もあります。

パラメータ:
version - java.io.ObjectStreamConstants から ProtocolVersion を使用
例外:
IllegalStateException - オブジェクトが直列化されたあとに呼び出された場合
IllegalArgument - 渡されたバージョンが無効な場合
関連項目:
ObjectStreamConstants.PROTOCOL_VERSION_1, ObjectStreamConstants.PROTOCOL_VERSION_2

writeObject

public final void writeObject(Object obj)
                       throws IOException
指定されたオブジェクトを ObjectOutputStream に書き込みます。オブジェクトのクラス、クラスのシグニチャー、クラスの非 transient および非 static フィールドとそのスーパークラスのすべての値が書き込まれます。あるクラスについてデフォルトの直列化は、writeObject と readObject メソッドを使ってオーバーライドすることができます。このオブジェクトによって参照されるオブジェクトは中間的に書き込まれ、それによって、オブジェクトの完全に同等なグラフが ObjectInputStream によってを再構築されます。

例外は、OutputStream に関する問題や、直列化するべきではないクラスについてスローされます。こすべての例外は、OutputStream にとって致命的で、OutputStream を不確定な状態にします。ストリームの状態を無視するか回復処理するかを決めるのは呼び出し側です。

定義:
インタフェース ObjectOutput 内の writeObject
例外:
InvalidClassException - 直列化で使用されるクラスになんらかの不具合があった場合
NotSerializableException - 直列化の対象が java.io.Serializable インタフェースを実装していない場合
IOException - 基礎の OutputStream に例外が発生した場合

defaultWriteObject

public void defaultWriteObject()
                        throws IOException
現在のクラスの非 static フィールドと非 transient フィールドを、ストリームに書き込みます。このメソッドを呼び出すことができるのは、直列化が行われているクラスの writeObject メソッドだけです。別の方法で呼び出された場合は NotActiveException をスローします。

putFields

public ObjectOutputStream.PutField putFields()
                                      throws IOException
ストリームに書き込まれる持続フィールドをバッファに格納するために使用されるオブジェクトを取得します。フィールドは、writeFields メソッドが呼び出されたときにストリームに書き込まれます。
導入されたバージョン:
JDK1.2

writeFields

public void writeFields()
                 throws IOException
バッファに格納されたフィールドをストリームに書き込みます。
例外:
NotActiveException - オブジェクトの状態を書き込むためにクラスの writeObject メソッドが呼び出されなかったときに呼び出された場合
導入されたバージョン:
JDK1.2

reset

public void reset()
           throws IOException
ストリームにすでに書き込まれているオブジェクトの状態を無効にします。状態は、新しい ObjectOutputStream の作成時と同じにリセットされます。ストリームの現在位置にマークが設定され、対応する ObjectInputStream も同じ位置にリセットされます。それ以前にストリームに書き込まれていたオブジェクトはストリーム上にあるとは見なされず、再度ストリームに書き込まれます。

annotateClass

protected void annotateClass(Class cl)
                      throws IOException
サブクラスは、クラスのデータをストリームに保存できるようにこのメソッドを実装する場合があります。デフォルトではこのメソッドは何も行いません。ObjectInputStream の対応するメソッドは resolveClass です。このメソッドは、ストリームの一意のクラスそれぞれについて 1 回だけ呼び出されます。その時点でクラス名とシグニチャーはすでにストリームに書き込まれています。このメソッドは、ObjectOutputStream を自由に使って、適当と判断されるならばクラスの任意の表現 (たとえば、クラスファイルのバイト) を保存できます。ObjectInputStream の対応するサブクラスの resolveClass メソッドは、annotateClass によって書き込まれたデータやオブジェクトを読み込み、使用しなければなりません。
例外:
IOException - 基礎の OutputStream に例外が発生した場合

replaceObject

protected Object replaceObject(Object obj)
                        throws IOException
直列化の際に、ObjectOutputStream の信頼できるサブクラスが、あるオブジェクトをほかのオブジェクトに置換できるようにします。オブジェクトの置き換えは、enableReplaceObject が呼び出されるまでは行えません。enableReplaceObject メソッドは、置換を要求しているストリームが信頼できるかどうかを調べます。直列化可能オブジェクトへのすべての参照は、replaceObject に渡されます。オブジェクトの private な状態が意図せずに漏洩することがないように、replaceObject を使うのは信頼できるストリームに限定されます。

サブクラスは、オブジェクトを置換するとき、直列化復元実行時に相補的に置換が行われるか、または置換されたオブジェクトと、参照が格納される各フィールドとの互換性を保証する必要があります。フィールドまたは配列要素の型のサブクラスではない型のオブジェクトは、例外を発生させることによって直列化を中断し、その結果オブジェクトは格納されません。

このメソッドは、各オブジェクトが最初に検出されたときに 1 回だけ呼び出されます。これ以後検出されるそのオブジェクトへの参照は、新しいオブジェクトにリダイレクトされます。このメソッドは、置換されるメソッドか、またはオリジナルのどちらかを返さなければなりません。

置換されるオブジェクトとして null を返すこともできますが、オリジナルオブジェクトへの参照を含むクラスでは、null ではなくオブジェクトが返されることを仮定しているものがあり、この場合は NullReferenceException がスローされます。

例外:
IOException - 基礎の OutputStream に例外が発生した場合

enableReplaceObject

protected boolean enableReplaceObject(boolean enable)
                               throws SecurityException
ストリームのオブジェクトを置換できるようにします。

置換が可能になると、replaceObject メソッドが、直列化される各オブジェクトについて呼び出されます。

enable が true で、セキュリティマネージャがインストールされている場合、このメソッドはまずセキュリティマネージャの checkPermission メソッドをアクセス権 SerializablePermission("enableSubstitution") で呼び出し、ストリームのオブジェクトをストリームが置換できるようにします。

例外:
SecurityException - セキュリティマネージャが存在し、その checkPermission メソッドが、ストリームのオブジェクトのストリームによる置換を許可しなかった場合
関連項目:
SecurityManager.checkPermission(java.security.Permission), java.security.SerializablePermission

writeStreamHeader

protected void writeStreamHeader()
                          throws IOException
サブクラスが自身のヘッダをストリームの前または後ろに追加できるように提供されています。このメソッドは、マジック番号とバージョン情報をストリームに書き込みます。

write

public void write(int data)
           throws IOException
データのバイトを書き込みます。このメソッドは、データが実際に書き込まれるまでブロックします。
定義:
インタフェース ObjectOutput 内の write
パラメータ:
b - バイトデータ
例外:
IOException - 入出力エラーが発生した場合
オーバーライド:
クラス OutputStream 内の write

write

public void write(byte[] b)
           throws IOException
バイト配列を書き込みます。このメソッドは、データが実際に書き込まれるまでブロックします。
定義:
インタフェース ObjectOutput 内の write
パラメータ:
b - 書き込まれるデータ
例外:
IOException - 入出力エラーが発生した場合
オーバーライド:
クラス OutputStream 内の write

write

public void write(byte[] b,
                  int off,
                  int len)
           throws IOException
バイト配列の一部を書き込みます。
定義:
インタフェース ObjectOutput 内の write
パラメータ:
b - 書き込むデータ
off - データの開始オフセット
len - 書き込むバイト数
例外:
IOException - 入出力エラーが発生した場合
オーバーライド:
クラス OutputStream 内の write

flush

public void flush()
           throws IOException
ストリームをフラッシュします。このメソッドは、バッファリングされているすべての出力バイトを書き込んで、基礎ストリームを通してフラッシュします。
定義:
インタフェース ObjectOutput 内の flush
例外:
IOException - 入出力エラーが発生した場合
オーバーライド:
クラス OutputStream 内の flush

drain

protected void drain()
              throws IOException
ObjectOutputStream にあるバッファデータをすべて空にします。flush と似た動作ですが、このメソッドでは基礎ストリームの flush は起こりません。

close

public void close()
           throws IOException
ストリームを閉じます。ストリームに関連するすべてのリソースを解放するために呼び出す必要があります。
定義:
インタフェース ObjectOutput 内の close
例外:
IOException - 入出力エラーが発生した場合
オーバーライド:
クラス OutputStream 内の close

writeBoolean

public void writeBoolean(boolean data)
                  throws IOException
boolean を書き込みます。
パラメータ:
data - 書き込む boolean

writeByte

public void writeByte(int data)
               throws IOException
8 ビットのバイトを書き込みます。
パラメータ:
data - 書き込むバイト値

writeShort

public void writeShort(int data)
                throws IOException
16 ビットの short を書き込みます。
パラメータ:
data - 書き込む short 値

writeChar

public void writeChar(int data)
               throws IOException
16 ビットの char を書き込みます。
パラメータ:
data - 書き込む char 値

writeInt

public void writeInt(int data)
              throws IOException
32 ビットの int を書き込みます。
パラメータ:
data - 書き込む integer 値

writeLong

public void writeLong(long data)
               throws IOException
64 ビットの long を書き込みます。
パラメータ:
data - 書き込む long 値

writeFloat

public void writeFloat(float data)
                throws IOException
32 ビットの float を書き込みます。
パラメータ:
data - 書き込む float 値

writeDouble

public void writeDouble(double data)
                 throws IOException
64 ビットの double を書き込みます。
パラメータ:
data - 書き込む double 値

writeBytes

public void writeBytes(String data)
                throws IOException
String をバイトの列として書き込みます
パラメータ:
s - 書き込むバイトの String

writeChars

public void writeChars(String data)
                throws IOException
String を char の列として書き込みます。
パラメータ:
s - 書き込む char の String

writeUTF

public void writeUTF(String data)
              throws IOException
この String のプリミティブデータを UTF 形式で書き込みます。 ストリームに String をプリミティブデータとして書き込むことと、Object として書き込むことには大きな違いがあります。writeObject によって書き込まれる String のインスタンスは、最初は String としてストリームに書き込まれます。それ以降の writeObject() の呼び出しは、文字列への参照をストリームに書き込みます。
パラメータ:
str - UTF 形式の String

Java プラットフォーム 1.2

バグや機能要求の報告
新しい javadoc の表示についてのコメントやご提案
Java は、米国およびその他の国における米国 Sun Microsystems, Inc. の商標もしくは登録商標です。
Copyright 1993-1998 Sun Microsystems, Inc. 901 San Antonio Road,
Palo Alto, California, 94303, U.S.A. All Rights Reserved.