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,000 | 001,235 |
000,000.#### | 001,234.567 |
000,000.0000 | 001,234.5670 |
より詳しい構文についてはDecimalFormatクラスのjavadocを参照してください。
11行目では、9行目と同じようにtypeとpatternの指定を行っていますが、こちらではtypeにdateの設定を行っています。
dateではjava.text.SimpleDateFormatクラスに使用できるフォーマット構文を使うことができます。
以下に基本的なフォーマットパターンとパターンごとの実行結果を示します。
【「2008/08/08 08:08:08」のフォーマット】
パターン | フォーマット結果 |
yy/MM | 08/08 |
yyyy/MM | 2008/08 |
yy/MM/dd | 08/08/08 |
yyyy/MM/dd | 2008/08/08 |
yyyy/MM/dd HH:MM:ss | 2008/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確認すると以下のようにデータが登録されています。
|
|