CB3 - チュートリアル 第3章 - 3.5固定長ファイルアクセス - その1

 3.5.1概要

  • このサンプルの目的
     このアプリケーション作成例を通して、以下について知ることができます。
    • サービスで固定長ファイルを扱う場合のファイルレコード(ライタ、リーダ)アクセッサの使用方法
    • ファイルレコードアクセッサを使用するときの固定長ファイル設定ファイルの作成方法

  • サンプルアプリケーションの内容
     固定長ファイルへの書込み、読込みを行い読み込み結果を標準出力へ表示するバッチアプリケーションです。  
     サンプルアプリケーションの概要を下図に示します。
     
     
     サービスで固定長ファイルにアクセスする場合は、CB3が提供するファイルレコード(ライタ、リーダ)アクセッサを利用します。
     ファイルレコードアクセッサは、設定ファイルの固定長ファイル(ライタ、リーダ)設定ファイルの内容をもとにファイルへの書込み、読込みを行います。
     
     このサンプルでは以下のファイルについて説明します。  
    • FixedLengthSample1.java
       サービスのプログラムです。上図内の赤枠の部分に相当します。
    • writerConfig1.xml
       固定長ファイルの項目の長さや型などのフォーマットを記述した設定ファイルです。
       上図内の固定長ファイルライタ設定ファイルに相当します。
    • readerConfig1.xml
       固定長ファイルの項目の長さや型などのフォーマットを記述した設定ファイルです。
       上図内の固定長ファイルリーダ設定ファイルに相当します。
    • applicationContext.xml
       CB3がserviceContext.xmlなどのspringフレームワーク関連の設定ファイルを読み込むための起点となる コンテキストファイルです。
    • serviceContext.xml
       実行対象のサービスを定義します。
    • 起動用バッチファイル - fixedlength1.bat
       サービスを起動するためのバッチファイルです。
    • fixedtest1.txt
       書込み読込み対象のファイルです。

 3.5.2サービスの作成

  • FixedLengthSample1 .java

     01:public class FixedLengthSample1 extends CB3Service {
     02:    private static final String FILE_PATH = "fixedtest1.txt";
     03:    @Override
     04:    protected int doService(ServiceParameters serviceparameters,
     05:            RuntimeParameters runtimeparameters) throws ServiceException {
     06:        fileWrite();
     07:        fileRead();
     08:        return 0;
     09:    }
     10:
     11:    /**
     12:     * ファイルへの書き込みを行う
     13:     */
     14:    private void fileWrite(){
     15:        FlatFileRecordWriter writer =
                     (FlatFileRecordWriter)getDataAccessContext().lookup("writerConfig1");
     16:        // ファイルオープン
     17:        writer.open(FILE_PATH);
     18:
     19:        // 追加するデータを設定する
     20:        HashMap<String, String> data = new HashMap<String, String>();
     21:        data.put("name","tanaka");
     22:        data.put("staffId","11");
     23:        // dateの場合はデフォルトの形で設定を行う yyyy/MM/dd HH:mm:ss
     24:        data.put("registrationDate","2008/01/01 00:00:00");
     25:
     26:        // 一行分のデータを追加したレコードを生成する
     27:        FlatFileRecord record = writer.createFlatFileRecord(data);
     28:
     29:        // ファイルへ書き込む
     30:        writer.write(record);
     31:
     32:        // ファイルクローズ
     33:        writer.close();
     34:    }
     35:
     36:    /**
     37:     * ファイルの読み込みを行う
     38:     */
     39:    private void fileRead(){
     40:        FlatFileRecordReader reader =
                     (FlatFileRecordReader)getDataAccessContext().lookup("readerConfig1");
     41:        // 読み込むファイルをオープン
     42:        reader.open(FILE_PATH);
     43:
     44:        FlatFileRecord record = null;
     45:        System.out.println("読み込み結果:" + FILE_PATH);
     46:
     47:        while((record = reader.nextRecord()) != null ){
     48:            System.out.println("name:" + record.getString("name"));
     49:            System.out.println("staffId:" + record.getString("staffId"));
     50:            System.out.println("registrationDate:" + record.getString("registrationDate"));
     51:        }
     52:    }
     53:}
    

    このサンプルはファイルへの書込み処理(14行目:fileWrite())を行った後、書込んだファイルの読込み(39行目:fileRead())処理を行っています。

    ■書込み処理
    15行目:
    ファイルレコードライタの取得を行います。この処理はDBアクセスのサンプルで紹介したときと同じようにlookup()メソッドで行います。

    17行目:
    open()メソッドでファイルのオープンを行います。引数にオープンするファイルパスを指定します。

    20行目〜24行目:
    各項目にデータの設定を行っています。各項目のデータの定義は固定長ファイルライタ設定ファイル(writerConfig1.xml)で行います。 このサンプルでの定義内容は次のようになっています。
    <field name="name" length="6"/>
    
    21行目のデータ設定処理に対応します。name属性と同じ値でデータを設定します。
    <field name="staffId" length="10" type="number" pattern="0000000000"/>
    
    22行目のデータ設定処理に対応します。length属性はデータを書込むときの長さをバイト単位で指定します。 type属性にはデータタイプを指定します。 データタイプにはnumberまたはdateを設定することができ、デフォルト(設定なし)では文字列としての扱いになります。 pattern属性にはデータのフォーマットパターンを指定します。 pattern属性に「0000000000」(10桁の0)を指定しているため、10桁に満たない数値の場合は、10桁になるように前に0が付加されてファイルに出力されます。
    <field name="registrationDate" length="10" type="date" pattern="yyyy/MM/dd"/>
    
    24行目のデータ設定処理に対応します。この例ではtypeにdate型の設定を行っています。
    date形式のデータを設定する場合、24行目の例(data.put("registrationDate","2008/01/01 00:00:00");)のようにデフォルトの フォーマット形式("yyyy/MM/dd HH:mm:ss")で設定する必要があります。設定されたデータがpattern属性に設定されたフォーマット形式に フォーマットされ、ファイルへ書き込まれます。

    ■読込み処理
    40行目:
    ファイルレコードリーダの取得を行います。この処理はDBアクセスのサンプルで紹介したときと同じようにlookup()メソッドで行います。

    42行目:
    open()メソッドでファイルのオープンを行います。引数にオープンするファイルパスを指定します。

    47行目〜51行目:
    ファイルレコードリーダからデータ1行分のレコードオブジェクトを取得し、読込みデータの取得を行っています。読込みデータの定義は 固定長ファイルリーダ設定ファイル(readerConfig1.xml)で行います。このサンプルでの定義内容は次のようになっています。
    <field name="name" length="6"/>
    
    48行目のデータ取得処理に対応しています。length属性で読み込むデータの長さを指定します。
    <field name="staffId" length="10" />
    
    49行目のデータ取得処理に対応しています。length属性で読み込むデータの長さを指定します。書込みの場合と違い、ファイル内のデータを そのまま取得しているため、typeやpatternの設定はありません。
    <field name="registrationDate" length="10"/>
    
    50行目のデータ取得処理に対応しています。length属性で読み込むデータの長さを指定します。上記と同様に書込みの場合と違い、ファイル内のデータを そのまま取得しているため、typeやpatternの設定はありません。

 3.5.3設定ファイルの作成

  • writerConfig1.xml
    固定長ファイルライタの設定ファイルです。

     01:<?xml version="1.0" encoding="UTF-8"?>
     02:<flatfile-writer  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     03:  xsi:noNamespaceSchemaLocation="FixedLengthRecordWriterConfig.xsd">
     04:  <append>false</append>
     05:  <format>
     06:    <fields>
     07:      <field name="name" length="6"/>
     08:
     09:      <field name="staffId" length="10" type="number" pattern="0000000000"/>
     10:
     11:      <field name="registrationDate" length="10" type="date" pattern="yyyy/MM/dd"/>
     12:    </fields>
     13:  </format>
     14:</flatfile-writer>
    

    4行目:
    appendタグでは追加、または上書きの設定を行うことができます。true:追加、false:上書きとなります。省略は上書きと同じです。

    7行目〜11行目:
    各項目の設定です。
    7行目のname項目ではname属性に加え、length属性にて6バイトの長さの文字列を書き込む設定を行っています。この2つの属性はともに必須属性です。
    9行目ではname、length属性に加えてtype属性とpattern属性の設定を行っています。type属性では項目の型を指定します。この属性に指定できる型には numberとdateがあります。pattern属性にはtype属性で指定した型のフォーマットパターンを指定することができます。この例では10桁の0埋めの指定を しています。
    numberに指定できるフォーマットパターンはjava.text.DecimalFormatクラスに使用できるフォーマット構文を使うことができます。以下に基本的なフォーマット パターンとパターンごとの実行結果を示します。

    【「1234.567」のフォーマット】
    パターンフォーマット結果
    ######1235
    ###,###1,235
    000,000001,235
    000,000.####001,234.567
    000,000.0000001,234.5670

    より詳しい構文についてはDecimalFormatクラスのjavadocを参照してください。

    11行目では、9行目と同じようにtypeとpatternの指定を行っていますが、こちらではtypeにdateの設定を行っています。 dateではjava.text.SimpleDateFormatクラスに使用できるフォーマット構文を使うことができます。 以下に基本的なフォーマットパターンとパターンごとの実行結果を示します。

    【「2008/08/08 08:08:08」のフォーマット】
    パターンフォーマット結果
    yy/MM08/08
    yyyy/MM2008/08
    yy/MM/dd08/08/08
    yyyy/MM/dd2008/08/08
    yyyy/MM/dd HH:MM:ss2008/08/08 08:08:08
    より詳しい構文についてはSimpleDateFormatクラスのjavadocを参照してください。

    その他、固定長ファイルライタ設定ファイルに設定できるタグとして、encodeタグ、lineSeparatorタグがあります。どちらもflatfile-writer/formatタグの 子要素として定義できます。

    encodeタグ:
    encodeタグにはエンコードの文字コードを指定することができます。指定がない場合はシステムのデフォルトエンコードを使用します。 文字コードはjava.nio.charset.Charsetの名前を指定できます。より詳しい説明についてはCharsetクラスのjavadocを参照してください。
    設定例:<encode>SJIS</encode>

    lineSeparatorタグ:
    lineSeparatorタグには改行コードを指定することができます。指定できる改行コードの有効値は「\r」「\r\n」「\n」の3つです。 指定がない場合はシステムのデフォルト改行コードを使用します。
    設定例:<lineSeparator>\r</lineSeparator>

  • readerConfig1.xml
    固定長ファイルリーダの設定ファイルです。

     01:<?xml version="1.0" encoding="UTF-8"?>
     02:<flatfile-reader  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     03:  xsi:noNamespaceSchemaLocation="FixedLengthRecordReaderConfig.xsd">
     04:  <format>
     05:    <fields>
     06:      <field name="name" length="6"/>
     07:
     08:      <field name="staffId" length="10" />
     09:
     10:      <field name="registrationDate" length="10"/>
     11:    </fields>
     12:  </format>
     13:</flatfile-reader>
    

    6行目〜10行目:
    各項目の設定です。
    このサンプルでは、書き出されたデータをそのまま読み込むので、必須項目のname、length属性以外の属性については特に定義を行っていません。

    その他、固定長ファイルリーダ設定ファイルに設定できるタグとして、encodeタグがあります。flatfile-reader/formatタグの子要素として定義できます。

    encodeタグ:
    固定長ファイルライタ設定ファイルと同様にencodeタグにはエンコードの文字コードを指定することができます。指定がない場合はシステムのデフォルトエンコードを使用します。
    設定例:<encode>SJIS</encode>

  • applicationContext.xml
    この設定ファイルはserviceContext.xmlをCB3が読み込むためのコンテキストファイルです。
    CB3はこのファイルを起点として、各設定ファイル(springフレームワーク関連の設定ファイル)の読込みを行います。

     01:<?xml version="1.0" encoding="UTF-8"?>
     02:    <-- 途中省略 -->
     03:    <import resource="serviceContext.xml"/>
     04:    <import resource="classpath:accessorContext.xml"/>
     05:    <import resource="classpath:loggingContext.xml"/>
     06:</beans>
    

  • serviceContext.xml
    このサンプルの実行に必要となるサービスのコンテキストファイルです。

     01:<?xml version="1.0" encoding="UTF-8"?>
     02:    <-- 途中省略 -->
     03:
     04:    <!-- ServiceProvider -->
     05:    <bean id="fixed1" class="jp.co.cybec.cb3.container.provider.ServiceProviderImpl">
     06:        <property name="service"><ref bean="sample1"/></property>
     07:    </bean>
     08:    <!-- Service -->
     09:    <bean id="sample1" class="jp.co.cybec.cb3.sample.file.fixed.FixedLengthSample1">
     10:        <property name="dataAccessContext"><ref bean="accessContext1"/></property>
     11:    </bean>
     12:
     13:    <-- 途中省略 -->
     14:
     15:    <!-- DataAccessContext -->
     16:    <bean id="accessContext1" class="jp.co.cybec.cb3.accessor.DataAccessContextImpl">
     17:        <constructor-arg index="0"><ref bean="testDataAccessors1"/></constructor-arg>
     18:    </bean>
     19:    <util:map id="testDataAccessors1">
     20:        <!-- アクセス用設定ファイル -->
     21:        <entry key="readerConfig1"><ref bean="fixedLengthRecordReader"/></entry>
     22:        <entry key="writerConfig1"><ref bean="fixedLengthRecordWriter"/></entry>
     23:    </util:map>
     24:
     25:    <-- 途中省略 -->
     26:</beans>
    

    21行目〜22行目:
    ファイルレコードアクセッサの設定を行っています。 このサンプルでは固定長ファイルの書込み処理と読込み処理を行っているので 固定長ファイルレコードリーダと固定長ファイルレコードライタの二つの設定を行っています。

 3.5.4サービスの実行

  • fixedlength1.bat
     01:@echo off
     02:
     03:setlocal
     04:
     05:call ./set_classpath_com.bat
     06:
     07:set CLASSPATH=%CB3_HOME%/resources/config/fixed;%CLASSPATH%
     08:
     09:java jp.co.cybec.cb3.container.provider.ServiceProviderImpl -ServiceName fixed1
     10:
     11:pause
    

    上記バッチファイルを実行すると下記のように表示されます。

    読み込み結果:fixedtest1.txt
    name:tanaka
    staffId:0000000011
    registrationDate:2008/01/01
    続行するには何かキーを押してください . . .
    

    fixedtest1.txt確認すると以下のようにデータが登録されています。