オブジェクトストリーム

オブジェクトストリームは、バイトストリーム(InputStream)を継承したクラスです。
目的は、システムやアプリケーションで作成されたクラスのインスタンスをファイルに保存するためのクラスです。

代表的な使われ方は、WebアプリケーションサーバのTomcatのセッション機能です。
Http接続中の利用者別のオブジェクト維持のための機能が存在します。
セッション情報は、SESSION.SERファイルに利用者の画面遷移情報や、ログイン情報などが格納されて管理されます。
セッション情報をデータベースに管理する方式もあります。

ビジネスシステムでは、利用頻度はまず少ないオブジェクトですが、独自のフレームワークを作成するときに利用する可能性があります。

オブジェクトストリームを利用するクラスには、java.io.Serializableをimplementsします。
J2EE(Servlet/JSPAPI等)を利用したWebアプリケーションでjava.io.SerializableがimplementsされているDtoを見かけるのはそのためです。
データベースが利用できないファイルベースのアプリケーションの際に、複雑なデータ構造をDtoで作成し何かしら一時的な保存用としては利便性がありそうです。

オブジェクトの入出力サンプル

ObjectInputStream,ObjectOutputStreamサンプル
package jp.co.yourcompany.education.io;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import jp.co.yourcompany.education.exception.ApplicationException;
import jp.co.yourcompany.education.log.InitApplication;
import jp.co.yourcompany.education.order.dto.Order;

/**
 * オブジェクトストリーム(java.io.ObjectOutputStream,java.io.ObjectInputStream)クラスの
 * 学習用サンプルクラス
 * @author raita.kuwabara
 */
public class JavaIOObjectStreamSample {
    /**
     * ロガーインスタンス
     */
    public static final Logger log = Logger.getLogger( JavaIOObjectStreamSample.class.getName() );

    /**
     * educationプロジェクトファイルデータ格納先ディレクトリ
     */
    public static final String PROJECT_DATA_DIR = "c:\\projects\\education\\data";

    /**
     * 入力データ格納先ディレクトリ
     */
    public static final String INPUT_DATA_DIR = JavaIOByteStreamSample.PROJECT_DATA_DIR  + "\\input";


    /**
     * オブジェクト入出力ファイル
     */
    final String filePath = INPUT_DATA_DIR + "\\object.dat";


    /**
     * デフォルトコンストラクタ
     * ログの初期化
     */
    public JavaIOObjectStreamSample(){
        InitApplication app = InitApplication.getInstance();
        app.init();
    }

    /**
     * 入出力ファイルのサンプル
     */
    public void execAllSample(){
        try {
            outputObjectFileSample();
            readObjectFileSample();
        } catch (ApplicationException e) {
            log.severe("オブジェクトデータの操作でエラーが発生したため異常終了しました。");
            log.log( Level.SEVERE , "例外内容" , e );
        }
        log.info("オブジェクトデータの操作は正常終了しました。");
    }

    /**
     * サンプルオブジェクトをファイルに出力する。
     * @throws ApplicationException ファイルの例外発生時
     */
    private void outputObjectFileSample() throws ApplicationException {
        List<Order> resultList = createSampleData();

        try(
            FileOutputStream fos = new FileOutputStream( new File( filePath ) );
            ObjectOutputStream oos = new ObjectOutputStream( fos );
        ){
            //firstSample List
            oos.writeObject( resultList );

        } catch (IOException e) {
            log.log( Level.SEVERE , "出力ファイル{0}:" , new String[] { filePath }  );
            log.log( Level.SEVERE , "例外内容" , e );
        }
    }

    /**
     * サンプルオブジェクトをファイルに出力する。
     * @throws ApplicationException ファイルの例外発生時
     */
    private void readObjectFileSample() throws ApplicationException {

        try(
            FileInputStream fis = new FileInputStream( new File( filePath ) );
            ObjectInputStream ois = new ObjectInputStream( fis );
        ){
            @SuppressWarnings("unchecked")
            List<Order> resultList = (List<Order>) ois.readObject();

            for( Order order : resultList ){
                System.out.println( order.getUserId() );
                System.out.println( order.getItemCd() );
                System.out.println( order.getItemName() );
                System.out.println( order.getListPrice() );
                System.out.println( order.getNowPrice() );
                System.out.println( order.getOrderDate() );
                System.out.println( order.getQuantity() );
                System.out.println( order.getManufacturer() );
            }

        } catch (ClassNotFoundException e ) {
            log.log( Level.SEVERE , "入力ファイル{0}に存在しないクラスが定義されています。:" , new String[] { filePath }  );
            log.log( Level.SEVERE , "例外内容" , e );

        } catch (IOException e ) {
            log.log( Level.SEVERE , "出力ファイル{0}:" , new String[] { filePath }  );
            log.log( Level.SEVERE , "例外内容" , e );
        }
    }


    /**
     * サンプルデータの作成
     * @result resultList 注文オブジェクトのサンプルリスト
     */
    private List<Order> createSampleData(){
        List<Order> resultList = new ArrayList<Order>();

        Order order1 = new Order();
        order1.setUserId("00000001");
        order1.setItemCd("123456");
        order1.setItemName("チョコケーキ");
        order1.setListPrice( Integer.valueOf( 200 ) );
        order1.setNowPrice( Integer.valueOf( 198 ) );
        order1.setOrderDate( new java.util.Date() );
        order1.setQuantity( Integer.valueOf( 1 ) );
        order1.setManufacturer("hoge製菓株式会社");
        resultList.add( order1 );

        Order order2 = new Order();
        order2.setUserId("00000002");
        order2.setItemCd("012345");
        order2.setItemName("イチゴケーキ");
        order2.setListPrice( Integer.valueOf( 270  ) );
        order2.setNowPrice( Integer.valueOf( 248 ) );
        order2.setOrderDate( new java.util.Date() );
        order2.setQuantity( Integer.valueOf( 1 ) );
        order2.setManufacturer("hoge製菓株式会社");
        resultList.add( order2 );
        return resultList;
    }


    /**
     * javacコマンドから実行されるメインメソッド
     * @param arags 引数不要
     */
    public static final void main( String[] args){
        JavaIOObjectStreamSample sample = new JavaIOObjectStreamSample();
        sample.execAllSample();
    }
}
				

サンプルのダウンロードと実行方法

  • java_sample20.zipファイルを「c:/download/java/samples/」に保存して下さい。
  • java_sample20.zipファイルを「c:/projects」配下に展開して下さい。
  • コマンドプロンプトを起動して、「sample20.bat」を実行して下さい。
  • javac,jar,javaが実行されてJavaIOObjectStreamSampleが実行されます。
  • 「c:/projects/education/logs」配下のログの実行結果を確認して下さい。
  • 「c:/projects/education/input/object.dat」ファイルにOraderオブジェクトのサンプルデータが出力されます。
    コンソールにobject.dataからオブジェクトに変換した結果が出力されます。
  • Linux,Unix,iOSの方はバッチファイルはお手数ですが作成して下さい。改行コードが「CRLF」の点ご留意ください。