ObjectInputStream
| 日本語 | 物入力流れ |
| 英語 | object input stream |
| ふりがな | おぶじぇくといんぷっとすとりーむ |
| フリガナ | オブジェクトインプットストリーム |
J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名はjava.io.ObjectInputStream。
ストリームクラス。InputStreamクラスのサブクラスであり、バイト入力ストリームクラスである。
FilterInputStreamクラスのサブクラスに当たり、バイト入力ストリームクラスの中では「取得用」に位置する。
対になる出力側のクラスはObjectOutputStreamクラスである。
ObjectOutputStreamクラスを用いて保存された、Serializableインターフェイスの実装クラスを取り出す際に使用する。
つまり、「直列化」されたクラスを取り出す際に使用する。
クラスの「保存」を行う際に、フィールドそれぞれを保存するのではなく、「まるごと」保存することを「直列化」という。この直列化されたクラスを取り出すのがObjectInputStreamクラスである。
ObjectInputStreamクラスとObjectOutputStreamクラスは対として使用する。
取得対象は、必ずObjectOutputStreamクラスのwriteObject()メソッドで出力したものでなければならない。
また、出力したクラスはSerializableインターフェイスの実装クラスでなければならない。
逆に言えば、直列化を行う際にはObjectInputStreamクラスとObjectOutputStreamクラスを使用する、ということである。
ObjectInputStreamクラスのコンストラクタに他のInputStreamクラスのサブクラスを渡すことで、そのクラスを「入力元」として取得する。
ObjectInputStreamクラスのreadObject()メソッドで、直列化されたクラスを取得する。
処理終了後はclose()メソッドを呼び終了処理を行う。
ストリームクラス。InputStreamクラスのサブクラスであり、バイト入力ストリームクラスである。
FilterInputStreamクラスのサブクラスに当たり、バイト入力ストリームクラスの中では「取得用」に位置する。
対になる出力側のクラスはObjectOutputStreamクラスである。
ObjectOutputStreamクラスを用いて保存された、Serializableインターフェイスの実装クラスを取り出す際に使用する。
つまり、「直列化」されたクラスを取り出す際に使用する。
クラスの「保存」を行う際に、フィールドそれぞれを保存するのではなく、「まるごと」保存することを「直列化」という。この直列化されたクラスを取り出すのがObjectInputStreamクラスである。
ObjectInputStreamクラスとObjectOutputStreamクラスは対として使用する。
取得対象は、必ずObjectOutputStreamクラスのwriteObject()メソッドで出力したものでなければならない。
また、出力したクラスはSerializableインターフェイスの実装クラスでなければならない。
逆に言えば、直列化を行う際にはObjectInputStreamクラスとObjectOutputStreamクラスを使用する、ということである。
ObjectInputStreamクラスのコンストラクタに他のInputStreamクラスのサブクラスを渡すことで、そのクラスを「入力元」として取得する。
ObjectInputStreamクラスのreadObject()メソッドで、直列化されたクラスを取得する。
処理終了後はclose()メソッドを呼び終了処理を行う。
// Sample.java
import java.io.Serializable;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ByteArrayInputStream;
import java.io.ObjectOutputStream;
import java.io.IOException;
public class Sample
{
public static void main( String[] args )
{
ByteArrayOutputStream byteArrayOutputStream = null;
ObjectOutputStream objectOutputStream = null;
ByteArrayInputStream byteArrayInputStream = null;
ObjectInputStream objectInputStream = null;
try
{
// まずは出力します。
// 出力先のByteArrayOutputStreamクラスを作ります。
byteArrayOutputStream = new ByteArrayOutputStream();
// これを出力先とするObjectOutputStreamクラスを作ります。
objectOutputStream = new ObjectOutputStream( byteArrayOutputStream );
// 書き込むデータを作ります。
SerializableData inputSerializableData = new SerializableData();
inputSerializableData.setData( 100 );
// データを書き込みます。
// ここで渡すクラスは「Serializableインターフェイスの実装クラス」
// である必要があります。
objectOutputStream.writeObject( inputSerializableData );
objectOutputStream.flush();
// 書き込まれたバイトデータをbyte型配列として取得します。
byte[] bytes = byteArrayOutputStream.toByteArray();
// 参考用に、byte型配列の中身を出力します。
for( int iF1 = 0; iF1 < bytes.length; ++iF1 )
{
System.out.print( Integer.toHexString( 0x000000FF & (int)bytes[iF1] ) + ", " );
}
System.out.println();
// ac, ed, 0, 5, 73, 72, 0, 10, 53, 65, 72, 69, 61, 6c, 69, 7a, 61, 62, 6c, 65, 44, 61, 74, 61, 67, fc, 9e, 56, ef, ec, df, 21, 2, 0, 1, 49, 0, 4, 64, 61, 74, 61, 78, 70, 0, 0, 0, 64,
// それを読み込みます。
// 入力元のByteArrayInputStreamクラスを作ります。
byteArrayInputStream = new ByteArrayInputStream( bytes );
// これを入力元とするDataOutputStreamクラスを作ります。
objectInputStream = new ObjectInputStream( byteArrayInputStream );
// データを取り出します。
SerializableData outputSerializableData = (SerializableData)objectInputStream.readObject();
System.out.println( outputSerializableData.getData() );
// 100
}
catch( IOException e )
{
// 入出力に失敗した場合等に、このIOException例外が投げられます。
e.printStackTrace();
}
catch( ClassNotFoundException e )
{
// ObjectInputStream#readObject()メソッドがthrows指定している
// ClassNotFoundException例外を受け取ります。
e.printStackTrace();
return;
}
finally
{
// ストリームを扱ったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
try
{
if( objectInputStream != null )
{
objectInputStream.close();
}
}
catch( IOException e )
{
// close()メソッドはIOExceptionがthrows指定されているので
// 一応受け取ります。
e.printStackTrace();
}
try
{
if( byteArrayInputStream != null )
{
byteArrayInputStream.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
try
{
if( objectOutputStream != null )
{
objectOutputStream.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
try
{
if( byteArrayOutputStream != null )
{
byteArrayOutputStream.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
}
}
}
/**
* 保存用データクラス。
* Serializableインターフェイスの実装クラスです。
*/
class SerializableData implements Serializable
{
/**
* privateなフィールド。
*/
private int data;
/**
* getter。
*/
public int getData()
{
return data;
}
/**
* setter。
*/
public void setData( int value )
{
this.data = value;
}
}
import java.io.Serializable;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ByteArrayInputStream;
import java.io.ObjectOutputStream;
import java.io.IOException;
public class Sample
{
public static void main( String[] args )
{
ByteArrayOutputStream byteArrayOutputStream = null;
ObjectOutputStream objectOutputStream = null;
ByteArrayInputStream byteArrayInputStream = null;
ObjectInputStream objectInputStream = null;
try
{
// まずは出力します。
// 出力先のByteArrayOutputStreamクラスを作ります。
byteArrayOutputStream = new ByteArrayOutputStream();
// これを出力先とするObjectOutputStreamクラスを作ります。
objectOutputStream = new ObjectOutputStream( byteArrayOutputStream );
// 書き込むデータを作ります。
SerializableData inputSerializableData = new SerializableData();
inputSerializableData.setData( 100 );
// データを書き込みます。
// ここで渡すクラスは「Serializableインターフェイスの実装クラス」
// である必要があります。
objectOutputStream.writeObject( inputSerializableData );
objectOutputStream.flush();
// 書き込まれたバイトデータをbyte型配列として取得します。
byte[] bytes = byteArrayOutputStream.toByteArray();
// 参考用に、byte型配列の中身を出力します。
for( int iF1 = 0; iF1 < bytes.length; ++iF1 )
{
System.out.print( Integer.toHexString( 0x000000FF & (int)bytes[iF1] ) + ", " );
}
System.out.println();
// ac, ed, 0, 5, 73, 72, 0, 10, 53, 65, 72, 69, 61, 6c, 69, 7a, 61, 62, 6c, 65, 44, 61, 74, 61, 67, fc, 9e, 56, ef, ec, df, 21, 2, 0, 1, 49, 0, 4, 64, 61, 74, 61, 78, 70, 0, 0, 0, 64,
// それを読み込みます。
// 入力元のByteArrayInputStreamクラスを作ります。
byteArrayInputStream = new ByteArrayInputStream( bytes );
// これを入力元とするDataOutputStreamクラスを作ります。
objectInputStream = new ObjectInputStream( byteArrayInputStream );
// データを取り出します。
SerializableData outputSerializableData = (SerializableData)objectInputStream.readObject();
System.out.println( outputSerializableData.getData() );
// 100
}
catch( IOException e )
{
// 入出力に失敗した場合等に、このIOException例外が投げられます。
e.printStackTrace();
}
catch( ClassNotFoundException e )
{
// ObjectInputStream#readObject()メソッドがthrows指定している
// ClassNotFoundException例外を受け取ります。
e.printStackTrace();
return;
}
finally
{
// ストリームを扱ったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
try
{
if( objectInputStream != null )
{
objectInputStream.close();
}
}
catch( IOException e )
{
// close()メソッドはIOExceptionがthrows指定されているので
// 一応受け取ります。
e.printStackTrace();
}
try
{
if( byteArrayInputStream != null )
{
byteArrayInputStream.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
try
{
if( objectOutputStream != null )
{
objectOutputStream.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
try
{
if( byteArrayOutputStream != null )
{
byteArrayOutputStream.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
}
}
}
/**
* 保存用データクラス。
* Serializableインターフェイスの実装クラスです。
*/
class SerializableData implements Serializable
{
/**
* privateなフィールド。
*/
private int data;
/**
* getter。
*/
public int getData()
{
return data;
}
/**
* setter。
*/
public void setData( int value )
{
this.data = value;
}
}
// Sample.java
import java.io.Serializable;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ByteArrayInputStream;
import java.io.ObjectOutputStream;
import java.io.IOException;
public class Sample
{
public static void main( String[] args )
{
ByteArrayOutputStream byteArrayOutputStream = null;
ObjectOutputStream objectOutputStream = null;
ByteArrayInputStream byteArrayInputStream = null;
ObjectInputStream objectInputStream = null;
try
{
// まずは出力します。
// 出力先のByteArrayOutputStreamクラスを作ります。
byteArrayOutputStream = new ByteArrayOutputStream();
// これを出力先とするObjectOutputStreamクラスを作ります。
objectOutputStream = new ObjectOutputStream( byteArrayOutputStream );
// 書き込むデータを作ります。
SerializableData inputSerializableData = new SerializableData();
inputSerializableData.setData( 100 );
// データを書き込みます。
// ここで渡すクラスは「Serializableインターフェイスの実装クラス」
// である必要があります。
objectOutputStream.writeObject( inputSerializableData );
objectOutputStream.flush();
// 書き込まれたバイトデータをbyte型配列として取得します。
byte[] bytes = byteArrayOutputStream.toByteArray();
// 参考用に、byte型配列の中身を出力します。
for( int iF1 = 0; iF1 < bytes.length; ++iF1 )
{
System.out.print( Integer.toHexString( 0x000000FF & (int)bytes[iF1] ) + ", " );
}
System.out.println();
// ac, ed, 0, 5, 73, 72, 0, 10, 53, 65, 72, 69, 61, 6c, 69, 7a, 61, 62, 6c, 65, 44, 61, 74, 61, 67, fc, 9e, 56, ef, ec, df, 21, 2, 0, 1, 49, 0, 4, 64, 61, 74, 61, 78, 70, 0, 0, 0, 64,
// それを読み込みます。
// 入力元のByteArrayInputStreamクラスを作ります。
byteArrayInputStream = new ByteArrayInputStream( bytes );
// これを入力元とするDataOutputStreamクラスを作ります。
objectInputStream = new ObjectInputStream( byteArrayInputStream );
// データを取り出します。
SerializableData outputSerializableData = (SerializableData)objectInputStream.readObject();
System.out.println( outputSerializableData.getData() );
// 100
}
catch( IOException e )
{
// 入出力に失敗した場合等に、このIOException例外が投げられます。
e.printStackTrace();
}
catch( ClassNotFoundException e )
{
// ObjectInputStream#readObject()メソッドがthrows指定している
// ClassNotFoundException例外を受け取ります。
e.printStackTrace();
return;
}
finally
{
// ストリームを扱ったら、最後にclose()メソッドを呼んで
// 後処理をします。また、これは必ず行うため、
// finally内で行います。
try
{
if( objectInputStream != null )
{
objectInputStream.close();
}
}
catch( IOException e )
{
// close()メソッドはIOExceptionがthrows指定されているので
// 一応受け取ります。
e.printStackTrace();
}
try
{
if( byteArrayInputStream != null )
{
byteArrayInputStream.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
try
{
if( objectOutputStream != null )
{
objectOutputStream.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
try
{
if( byteArrayOutputStream != null )
{
byteArrayOutputStream.close();
}
}
catch( IOException e )
{
e.printStackTrace();
}
}
}
}
/**
* 保存用データクラス。
* Serializableインターフェイスの実装クラスです。
*/
class SerializableData implements Serializable
{
/**
* privateなフィールド。
*/
private int data;
/**
* getter。
*/
public int getData()
{
return data;
}
/**
* setter。
*/
public void setData( int value )
{
this.data = value;
}
}




