CB3 - チュートリアル 第3章 - 3.7可変長ファイルアクセス - その1

 3.7.1概要

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

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

 3.7.2サービスの作成

  • DelimitedLineSample1 .java

     01:public class DelimitedLineSample1 extends CB3Service {
     02:    private static final String FILE_PATH = "delimitedtest1.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"/>
    
    21行目のデータ設定処理に対応します。name属性と同じ値でデータを設定します。
    <field name="staffId" type="number" pattern="0000000000"/>
    
    22行目のデータ設定処理に対応します。type属性にはデータタイプを指定します。データタイプにはnumberまたはdateを設定することができ、 デフォルト(設定なし)では文字列としての扱いになります。pattern属性にはデータのフォーマットパターンを指定します。 pattern属性に「0000000000」(10桁の0)を指定しているため、10桁に満たない数値の場合は、10桁になるように前に0が付加されてファイルに出力されます。
    <field name="registrationDate" 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"/>
    
    48行目のデータ取得処理に対応しています。
    <field name="staffId"/>
    
    49行目のデータ取得処理に対応しています。書込みの場合と違い、ファイル内のデータをそのまま取得しているため、typeやpatternの設定はありません。
    <field name="registrationDate"/>
    
    50行目のデータ取得処理に対応しています。上記と同様に書込みの場合と違い、ファイル内のデータをそのまま取得しているため、typeやpatternの設定はありません。

 3.7.3設定ファイルの作成

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

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

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

    8行目〜12行目:
    各項目の設定です。
    8行目のname項目ではname属性に項目名を設定しています。この属性は必須属性です。
    10行目ではnameに加えてtype属性とpattern属性の設定を行っています。type属性では項目の型を指定します。この属性に指定できる型には numberとdateがあります。pattern属性にはtype属性で指定した型のフォーマットパターンを指定することができます。この例では10桁の0埋めの指定を しています。
    numberに指定できるフォーマットパターンはjava.text.DecimalFormatクラスに使用できるフォーマット構文を使うことができます。
    「3.5固定長ファイルアクセス - その1」に基本的なフォーマット構文を紹介していますので合わせて参照してください。

    12行目では、11行目と同じようにtypeとpatternの指定を行っていますが、こちらではtypeにdateの設定を行っています。 dateではjava.text.SimpleDateFormatクラスに使用できるフォーマット構文を使うことができます。
    「3.5固定長ファイルアクセス - その1」に基本的なフォーマット構文を紹介していますので合わせて参照してください。

    14行目:
    クォートキャラクタの設定を行っています。この設定を行うと例えば「"name"」のようにその文字で囲んだ書込みを行うことができます。

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

    separatorタグ:
    separatorタグには区切り文字の設定を行うことができます。省略した場合(デフォルト値)は「,(カンマ)」が使用されます。
    設定例:<separator>#</separator>

    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
     03: xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     04: xsi:noNamespaceSchemaLocation="DelimitedLineRecordReaderConfig.xsd">
     05:  <format>
     06:    <filepath>delimitedtest1.txt</filepath>
     07:    <fields>
     08:      <field name="name"/>
     09:
     10:      <field name="staffId"/>
     11:
     12:      <field name="registrationDate"/>
     13:    </fields>
     14:    <quotechar>"</quotechar>
     15:  </format>
     16:</flatfile-reader>
    

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

    14行目:
    クォートキャラクタの設定を行っています。この設定を行うと例えば読込みデータが「"name"」のように指定文字で囲まれていた場合にその文字を除去 した形で読込みを行うことができます。

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

    separatorタグ:
    separatorタグには区切り文字の設定を行うことができます。省略した場合(デフォルト値)は「,(カンマ)」が使用されます。
    設定例:<separator>#</separator>

    skipLinesタグ:
    読込み時のスキップ行数を指定できます。下記設定例では2行飛ばして3行目から読込みを行います。
    設定例:<skipLines>2</skipLines>

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

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

     01:<?xml version="1.0" encoding="UTF-8"?>
     02:    <-- 途中省略 -->
     03:
     04:    <!-- ServiceProvider -->
     05:    <bean id="delimited1" 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.delimited.DelimitedLineSample1">
     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="delimitedLineRecordReader"/></entry>
     22:        <entry key="writerConfig1"><ref bean="delimitedLineRecordWriter"/></entry>
     23:    </util:map>
     24:
     25:    <!-- 途中省略 -->
     26:</beans>
    

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

 3.7.4サービスの実行

  • delimitedline1.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 delimited1
     10:
     11:pause
    

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

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

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