|
JavaTM 2 Platform Std. Ed. v1.3 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 内部クラス | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
java.lang.Object | +--java.io.InputStream | +--java.io.ObjectInputStream
事前に ObjectOutputStream を使って作成されたプリミティブデータとプリミティブオブジェクトを直列化復元します。 ObjectOutputStream と ObjectInputStream は、FileOutputStream または FileInputStream とともに使えば、アプリケーションに、オブジェクトのグラフのための持続的なストレージを提供することができます。ObjectInputStream は、事前に直列化されたオブジェクトを元に戻すために使います。ほかの使用方法としては、ソケットストリームの使用による、ホスト間でのオブジェクトの受け渡しや、リモート通信システムにおける属性やパラメータの整列や整列解除があります。
ObjectInputStream は、ストリームから作成されたオブジェクトグラフにおけるすべての型のオブジェクトが、Java Virual Machine に存在するクラスに確実にマッチするようにします。クラスは、標準の機構を使って必要に応じてロードされます。
ストリームから読み込むことができるのは、java.io.Serializable インターフェースか java.io.Externalizable インターフェースをサポートするオブジェクトだけです。 オブジェクトをストリームから読み込むには readObject メソッドを使います。希望の型を取得するには、Java の安全なキャストを使う必要があります。Java では、文字列と配列はオブジェクトで、直列化の間はオブジェクトとして扱われます。それらを読み込む際には、希望の型にキャストされている必要があります。
基本データ型をストリームから読み込むには、DataInput の適切なメソッドを使います。
オブジェクトのデフォルトの直列化復元機構は、各フィールドの内容を、書き込まれたときの状態に戻します。transient または static と宣言されたフィールドは、直列化復元処理では無視されます。ほかのオブジェクトを参照すると、それらのオブジェクトは、必要に応じてストリームから読み込まれます。オブジェクトのグラフは、参照共有機構を使って正しく復元されます。直列化復元が行われるときには、常に新しいオブジェクトが割り当てられ、それによって既存のオブジェクトへの上書きが防止されます。
オブジェクトの読み込みは、新しいオブジェクトのコンストラクタの実行に似ています。メモリがオブジェクトに割り当てられ、ゼロ (NULL) に初期化されます。直列化可能でないクラスに対して、引数なしのコンストラクタが呼び出されたあと、直列化可能クラスのフィールドが、java.lang.Object にもっとも近いクラスから始まってもっともオブジェクトに固有のクラスで終わるストリームから復元されます。
たとえば、ObjectOutputStream の例で書き込まれたストリームからの読み込みは、次のように行います。
FileInputStream istream = new FileInputStream("t.tmp"); ObjectInputStream p = new ObjectInputStream(istream); int i = p.readInt(); String today = (String)p.readObject(); Date date = (Date)p.readObject(); istream.close();クラスは、インタフェース java.io.Serializable または java.io.Externalizable を実装することによって、クラスがどのように直列化されるかを制御します。
Serializable インターフェースを実装することによって、オブジェクトの直列化が、オブジェクトの状態全体の保存と復元を行うことが可能になり、またクラスが、ストリームの書き込み時とストリームの読み込み時の間に展開することが可能になります。オブジェクトの直列化は、オブジェクト間の参照を自動的に移動し、オブジェクトグラフの全体を保存および復元します。 直列化処理と直列化復元処理のときに特別な操作を必要とする Serializable クラスは、次のメソッドの両方を実装する必要があります。
private void writeObject(java.io.ObjectOutputStream stream) throws IOException; private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException;
readObject メソッドは、対応する writeObject メソッドによってストリームに書き込まれたデータを使用する特定のクラスについて、オブジェクトの状態を保存および復元する責任を持ちます。このメソッドは、そのスーパークラスやサブクラスに属する状態に関与する必要はありません。状態を復元するには、個々のフィールドについて ObjectInputStream からデータを読み込み、オブジェクトの適切なフィールドへの割り当てを行います。基本データ型の読み込みは、DataInput によってサポートされます。
直列化は、java.io.Serializable インターフェースを実装しないオブジェクトのフィールドの読み込みや、それらのフィールドへの値の割り当ては行いません。直列化可能でないオブジェクトのサブクラスを直列化可能にすることは可能です。この場合、直列化可能でないクラスは、そのフィールドを初期化できるようにするため、引数なしのコンストラクタを持つ必要があります。この場合、直列化可能でないクラスの状態を保存および復元するのは、サブクラスの責任になります。そのクラスのフィールドがアクセス可能である (public、package、または protected) 場合、あるいは状態の復元に利用できる set メソッドや get メソッドがある場合がしばしばあります。
オブジェクトを直列化復元する間に発生したすべての例外は、ObjectInputStream にキャッチされ、読み込み処理を異常終了させます。
Externalizable インターフェースを実装すると、オブジェクトの直列化された形式の内容および形式をオブジェクト側が完全に制御することが可能になります。Externalizable インターフェースのメソッドである writeExternal と readExternal は、オブジェクトの状態を保存および復元するために呼び出されます。これらのメソッドは、クラスによって実装された場合には、ObjectOutput と ObjectInput のすべてのメソッドを使って、自身の状態の書き込みおよび読み込みを行うことができます。どのようなバージョンであっても処理できるようにするのは、オブジェクトの責任です。
DataInput
,
ObjectOutputStream
,
Serializable
,
「オブジェクト直列化仕様の第 3 章オブジェクト入力クラス」内部クラスの概要 | |
static class |
ObjectInputStream.GetField
入力ストリームから読み込まれた持続フィールドへのアクセスを提供します。 |
コンストラクタの概要 | |
protected |
ObjectInputStream()
ObjectInputStream を完全に再実装するサブクラスが、ObjectInputStream のこの実装によって使用されたばかりの private データを割り当てる必要がないようにする手段を提供します。 |
|
ObjectInputStream(InputStream in)
指定された InputStream から読み込む ObjectInputStream を作成します。 |
メソッドの概要 | |
int |
available()
ブロックせずに読み込むことができるバイト数を返します。 |
void |
close()
入力ストリームを閉じます。 |
void |
defaultReadObject()
現在のクラスの非 static および非 transient のフィールドを、このストリームから読み込みます。 |
protected boolean |
enableResolveObject(boolean enable)
ストリームから読み込まれたオブジェクトを置換できるようにします。 |
int |
read()
データのバイトを読み込みます。 |
int |
read(byte[] b,
int off,
int len)
バイトの配列に読み込みます。 |
boolean |
readBoolean()
boolean を読み込みます。 |
byte |
readByte()
8 ビットのバイトを読み込みます。 |
char |
readChar()
16 ビットの char を読み込みます。 |
protected ObjectStreamClass |
readClassDescriptor()
直列化ストリームからクラス記述子を読み込みます。 |
double |
readDouble()
64 ビットの double を読み込みます。 |
ObjectInputStream.GetField |
readFields()
ストリームから持続フィールドを読み込み、それらを名前を指定してアクセスできるようにします。 |
float |
readFloat()
32 ビットの float を読み込みます。 |
void |
readFully(byte[] data)
バイトを読み込みます。 |
void |
readFully(byte[] data,
int offset,
int size)
バイトを読み込みます。 |
int |
readInt()
32 ビットの int を読み込みます。 |
String |
readLine()
推奨されていません。 このメソッドはバイトを正確に文字に変換しません。詳細および代替メソッドについては DataInputStream を参照してください。 |
long |
readLong()
64 ビットの long を読み込みます。 |
Object |
readObject()
ObjectInputStream からオブジェクトを読み込みます。 |
protected Object |
readObjectOverride()
引数なしの protected コンストラクタを使用して ObjectOutputStream を作成した ObjectOutputStream の信頼できるサブクラスによって呼び出されます。 |
short |
readShort()
16 ビットの short を読み込みます。 |
protected void |
readStreamHeader()
サブクラスが自身のストリームヘッダの読み込みと検証を行えるようにするために提供されています。 |
int |
readUnsignedByte()
符号なし 8 ビットバイトを読み込みます。 |
int |
readUnsignedShort()
符号なし 16 ビットの short を読み込みます。 |
String |
readUTF()
UTF 形式の文字列を読み込みます。 |
void |
registerValidation(ObjectInputValidation obj,
int prio)
オブジェクトグラフが返される前に検証されるべきオブジェクトを登録します。 |
protected Class |
resolveClass(ObjectStreamClass v)
指定されたストリームクラスの記述に対応するローカルクラスをロードします。 |
protected Object |
resolveObject(Object obj)
直列化復元の際に、ObjectInputStream の信頼できるサブクラスが、あるオブジェクトをほかのオブジェクトに置換できるようにします。 |
protected Class |
resolveProxyClass(String[] interfaces)
プロキシクラス記述子で指定されたインタフェースを実装するプロキシクラスを返します。 |
int |
skipBytes(int len)
バイトをスキップします。 |
クラス java.io.InputStream から継承したメソッド |
mark, markSupported, read, reset, skip |
クラス java.lang.Object から継承したメソッド |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
インタフェース java.io.ObjectInput から継承したメソッド |
read, skip |
コンストラクタの詳細 |
public ObjectInputStream(InputStream in) throws IOException, StreamCorruptedException
in
- 読み込み元の基本となる InputStream
StreamCorruptedException
- マジック番号またはバージョン番号が不正な場合IOException
- 基本となるストリームに例外が発生した場合protected ObjectInputStream() throws IOException, SecurityException
セキュリティマネージャがインストールされている場合、このメソッドはまずセキュリティマネージャの checkPermission
メソッドをアクセス権 SerializablePermission("enableSubclassImplementation")
で呼び出し、サブクラス化を有効にできるようにします。
IOException
- サブクラスによって呼び出されなかった場合SecurityException
- セキュリティマネージャが存在し、その checkPermission
メソッドがサブクラス化を有効にすることを拒否した場合SecurityManager.checkPermission(java.security.Permission)
,
SerializablePermission
メソッドの詳細 |
public final Object readObject() throws OptionalDataException, ClassNotFoundException, IOException
ルートオブジェクトは、参照するフィールドとオブジェクトのすべてが復元された時、完全に復元されます。この時点で、それらの登録された優先順位に基づいて、オブジェクト検証コールバックが実行されます。このコールバックは、(特別な readObject メソッドの) オブジェクトによって、それらが個別に復元されるときに登録されます。 例外は、InputStream に関する問題や、直列化復元するべきではないクラスについてスローされます。すべての例外は、InputStream にとって致命的で、InputStream を不確定の状態にします。ストリームの状態を無視するか回復処理するかを決めるのは呼び出し側です。
ObjectInput
内の readObject
ClassNotFoundException
- 直列化されたオブジェクトのクラスが見つからなかった場合InvalidClassException
- 直列化で使用されるクラスになんらかの不具合があった場合StreamCorruptedException
- ストリームの制御情報に一貫性がない場合OptionalDataException
- プリミティブデータが、オブジェクトではなくストリームに見つかった場合IOException
- 通常の入出力関連の例外のどれかが発生した場合protected Object readObjectOverride() throws OptionalDataException, ClassNotFoundException, IOException
ClassNotFoundException
- 直列化されたオブジェクトのクラスが見つからなかった場合OptionalDataException
- プリミティブデータが、オブジェクトではなくストリームに見つかった場合IOException
- 基本となるストリームの読み込み中に入出力エラーが発生した場合ObjectInputStream()
,
readObject()
public void defaultReadObject() throws IOException, ClassNotFoundException, NotActiveException
ClassNotFoundException
- 直列化されたオブジェクトのクラスが見つからなかった場合IOException
- 入出力エラーが発生した場合NotActiveException
- ストリームが現在オブジェクトを読み込んでいない場合public ObjectInputStream.GetField readFields() throws IOException, ClassNotFoundException, NotActiveException
GetField
オブジェクトClassNotFoundException
- 直列化されたオブジェクトのクラスが見つからなかった場合IOException
- 入出力エラーが発生した場合NotActiveException
- ストリームが現在オブジェクトを読み込んでいない場合public void registerValidation(ObjectInputValidation obj, int prio) throws NotActiveException, InvalidObjectException
obj
- 検証のコールバックを受け取るオブジェクトprio
- コールバックの順序を制御する値。0 が適切なデフォルト値である。早くコールバックする場合は大きい番号を、あとでコールバックする場合は小さい番号を使う。同じ優先順位内では、コールバックの処理に特別な順序はないNotActiveException
- ストリームが現在オブジェクトを読み込んでいないため、コールバックを登録できない場合InvalidObjectException
- 検証オブジェクトが null の場合protected Class resolveClass(ObjectStreamClass v) throws IOException, ClassNotFoundException
デフォルトでは、クラス名は、readObject を呼び出したクラスと対応付けて解決されます。
v
- ObjectStreamClass クラスのインスタンスv
に対応する Class オブジェクトIOException
- 通常の入出力関連の例外のどれかが発生した場合ClassNotFoundException
- 直列化されたオブジェクトが見つからなかった場合protected Class resolveProxyClass(String[] interfaces) throws IOException, ClassNotFoundException
このメソッドはストリームの一意の各プロキシクラス記述子について 1 回だけ呼び出されます。
ObjectOutputStream
での対応するメソッドは annotateProxyClass
です。このメソッドをオーバーライドする指定されたサブクラス ObjectInputStream
に対して、ObjectOutputStream
の対応するサブクラスにある annotateProxyClass
メソッドはこのメソッドが読み込む任意のデータまたはオブジェクトを書き込む必要があります。
ObjectInputStream
にあるこのメソッドのデフォルト実装は、interfaces
パラメータで指定されたインタフェースの Class
オブジェクトのリストとともに Proxy.getProxyClass
の呼び出し結果を返します。各インタフェース名 i
の Class
オブジェクトが返されます。
Class.forName(i, false, loader)ここで
loader
は、実行スタックまでの最初の null でないクラス、または null でないクラスローダがスタック側 (resolveClass
メソッドが使用する同じクラスローダの選択) にない場合は null
です。この loader
の同じ値も Proxy.getProxyClass
に渡されるクラスローダです。Proxy.getProxyClass
が IllegalArgumentException
をスローすると、resolveProxyClass
は IllegalArgumentException
を含めて ClassNotFoundException
をスローします。interfaces
- プロキシクラス記述子に直列化復元されたインタフェース名のリストIOException
- 基本となる InputStream
に例外が発生した場合ClassNotFoundException
- プロキシクラスまたは指定されたインタフェースがどれも見つからなかった場合ObjectOutputStream.annotateProxyClass(Class)
protected Object resolveObject(Object obj) throws IOException
このメソッドは、オブジェクトが読み込まれたあと、readObject から復帰する前に呼び出されます。デフォルトの resolveObject メソッドは、同じオブジェクトだけを返します。
サブクラスは、オブジェクトを置換するとき、置換されたオブジェクトと、参照が格納される各フィールドとの互換性を保証する必要があります。フィールドまたは配列要素の型のサブクラスではない型のオブジェクトは、例外を発生させることによって直列化を中断し、その結果オブジェクトは格納されません。
このメソッドは、各オブジェクトが最初に検出されたときに 1 回だけ呼び出されます。これ以後検出されるそのオブジェクトへの参照は、新しいオブジェクトにリダイレクトされます。
obj
- 置換されるオブジェクトIOException
- 通常の入出力関連の例外が発生した場合protected boolean enableResolveObject(boolean enable) throws SecurityException
checkPermission
メソッドをアクセス権 SerializablePermission("enableSubstitution")
で呼び出し、ストリームから読み込まれたオブジェクトの置換をストリームが許可できるようにします。enable
- 直列化復元される各オブジェクトについて resolveObject
の使用を有効にする場合は trueSecurityException
- セキュリティマネージャが存在し、その checkPermission
メソッドが、ストリームから読み込まれたオブジェクトの置換をストリームが許可できるようにすることを拒否する場合SecurityManager.checkPermission(java.security.Permission)
,
SerializablePermission
protected void readStreamHeader() throws IOException, StreamCorruptedException
IOException
- 基本となる InputStream
の読み込み中に入出力エラーが発生した場合StreamCorruptedException
- ストリームの制御情報に一貫性がない場合protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException
writeClassDescriptor
メソッドをオーバーライドした ObjectOutputStream のサブクラスによって) 書き込まれたクラス記述子に読み込みます。デフォルトでは、このメソッドはクラス記述子をオブジェクト直列化仕様に定義された形式で読み込みます。
IOException
- 入出力エラーが発生した場合ClassNotFoundException
- クラス記述子表現に使用した直列化されたオブジェクトのクラスが見つからなかった場合ObjectOutputStream.writeClassDescriptor(java.io.ObjectStreamClass)
public int read() throws IOException
ObjectInput
内の read
InputStream
内の read
IOException
- 入出力エラーが発生した場合public int read(byte[] b, int off, int len) throws IOException
ObjectInput
内の read
InputStream
内の read
b
- データの読み込み先のバッファoff
- データの開始オフセットlen
- 読み込まれる最大バイト数IOException
- 入出力エラーが発生した場合DataInputStream.readFully(byte[],int,int)
public int available() throws IOException
ObjectInput
内の available
InputStream
内の available
IOException
- 基本となる InputStream
の読み込み中に入出力エラーが発生した場合public void close() throws IOException
ObjectInput
内の close
InputStream
内の close
IOException
- 入出力エラーが発生した場合public boolean readBoolean() throws IOException
DataInput
内の readBoolean
EOFException
- ファイルの終わりに達した場合IOException
- ほかの入出力エラーが発生した場合public byte readByte() throws IOException
DataInput
内の readByte
EOFException
- ファイルの終わりに達した場合IOException
- ほかの入出力エラーが発生した場合public int readUnsignedByte() throws IOException
DataInput
内の readUnsignedByte
EOFException
- ファイルの終わりに達した場合IOException
- ほかの入出力エラーが発生した場合public short readShort() throws IOException
DataInput
内の readShort
EOFException
- ファイルの終わりに達した場合IOException
- ほかの入出力エラーが発生した場合public int readUnsignedShort() throws IOException
DataInput
内の readUnsignedShort
EOFException
- ファイルの終わりに達した場合IOException
- ほかの入出力エラーが発生した場合public char readChar() throws IOException
DataInput
内の readChar
EOFException
- ファイルの終わりに達した場合IOException
- ほかの入出力エラーが発生した場合public int readInt() throws IOException
DataInput
内の readInt
EOFException
- ファイルの終わりに達した場合IOException
- ほかの入出力エラーが発生した場合public long readLong() throws IOException
DataInput
内の readLong
EOFException
- ファイルの終わりに達した場合IOException
- ほかの入出力エラーが発生した場合public float readFloat() throws IOException
DataInput
内の readFloat
EOFException
- ファイルの終わりに達した場合IOException
- ほかの入出力エラーが発生した場合public double readDouble() throws IOException
DataInput
内の readDouble
EOFException
- ファイルの終わりに達した場合IOException
- ほかの入出力エラーが発生した場合public void readFully(byte[] data) throws IOException
DataInput
内の readFully
data
- データの読み込み先のバッファEOFException
- ファイルの終わりに達した場合IOException
- ほかの入出力エラーが発生した場合public void readFully(byte[] data, int offset, int size) throws IOException
DataInput
内の readFully
data
- データの読み込み先のバッファoffset
- データの開始オフセットsize
- 読み込む最大バイト数EOFException
- ファイルの終わりに達した場合IOException
- ほかの入出力エラーが発生した場合public int skipBytes(int len) throws IOException
DataInput
内の skipBytes
len
- スキップするバイト数EOFException
- ファイルの終わりに達した場合IOException
- ほかの入出力エラーが発生した場合public String readLine() throws IOException
DataInput
内の readLine
IOException
- 基本となる InputStream
の読み込み中に入出力エラーが発生した場合public String readUTF() throws IOException
DataInput
内の readUTF
IOException
- 基本となる InputStream
の読み込み中に入出力エラーが発生した場合
|
JavaTM 2 Platform Std. Ed. v1.3 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 内部クラス | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
Java、Java 2D、JDBC は、米国およびその他の国における米国 Sun Microsystems, Inc. の商標もしくは登録商標です。
Copyright 1993-2000 Sun Microsystems, Inc. 901 San Antonio Road,
Palo Alto, California, 94303, U.S.A. All Rights Reserved.