ObjectOutputStream
日本語 | 物出力流れ |
英語 | object output stream |
ふりがな | おぶじぇくとあうとぷっとすとりーむ |
フリガナ | オブジェクトアウトプットストリーム |
J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名はjava.io.ObjectOutputStream。
ストリームクラス。OutputStreamクラスのサブクラスであり、バイト出力ストリームクラスである。
FilterOutputStreamクラスのサブクラスに当たり、バイト出力ストリームクラスの中では「出力用」に位置する。
「直列化可能」なクラスをバイトストリームに出力する際に使用する。
クラスの「保存」を行う際に、フィールドそれぞれを保存するのではなく、「まるごと」保存することを「直列化」という。この直列化を行うクラスがObjectOutputStreamクラスである。
直列化されたクラスはObjectInputStreamクラスを使用して取得することができる。
出力するクラスはSerializableインターフェイスの実装クラスでなければならない。
逆に言えば、直列化を行う際にはObjectOutputStreamクラスとObjectInputStreamクラスを使用する、ということである。
ObjectOutputStreamクラスのコンストラクタに他のOutputStreamクラスのサブクラスを渡すことで、そのクラスを「出力先」として出力する。
ObjectOutputStreamクラスのwriteObject()メソッドで、クラスをそのままバイトストリームに出力する。つまり「直列化」を行う。
処理終了後はclose()メソッドを呼び終了処理を行う。
直列化されたクラスはObjectInputStreamクラスを用いて取得する。
ストリームクラス。OutputStreamクラスのサブクラスであり、バイト出力ストリームクラスである。
FilterOutputStreamクラスのサブクラスに当たり、バイト出力ストリームクラスの中では「出力用」に位置する。
「直列化可能」なクラスをバイトストリームに出力する際に使用する。
クラスの「保存」を行う際に、フィールドそれぞれを保存するのではなく、「まるごと」保存することを「直列化」という。この直列化を行うクラスがObjectOutputStreamクラスである。
直列化されたクラスはObjectInputStreamクラスを使用して取得することができる。
出力するクラスはSerializableインターフェイスの実装クラスでなければならない。
逆に言えば、直列化を行う際にはObjectOutputStreamクラスとObjectInputStreamクラスを使用する、ということである。
ObjectOutputStreamクラスのコンストラクタに他のOutputStreamクラスのサブクラスを渡すことで、そのクラスを「出力先」として出力する。
ObjectOutputStreamクラスのwriteObject()メソッドで、クラスをそのままバイトストリームに出力する。つまり「直列化」を行う。
処理終了後はclose()メソッドを呼び終了処理を行う。
直列化されたクラスはObjectInputStreamクラスを用いて取得する。
// 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; } }