FixedLengthSample2.java
01:public class FixedLengthSample2 extends CB3Service {
02: private static final String FILE_PATH = "fixedtest2.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("writerConfig2");
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: data.put("staffSubId","12");
24: // dateの場合はデフォルトの形で設定を行う yyyy/MM/dd HH:mm:ss
25: data.put("registrationDate","2008/01/01 00:00:00");
26:
27: // 一行分のデータを追加したレコードを生成する
28: FlatFileRecord record = writer.createFlatFileRecord(data);
29:
30: // ファイルへの書き込む
31: writer.write(record);
32:
33: // ファイルクローズ
34: writer.close();
35: }
36:
37: /**
38: * ファイルの読み込みを行う
39: */
40: private void fileRead(){
41: FlatFileRecordReader reader =
(FlatFileRecordReader)getDataAccessContext().lookup("readerConfig2");
42: // 読み込むファイルをオープン
43: reader.open(FILE_PATH);
44:
45: FlatFileRecord record = null;
46: System.out.println("読み込み結果:" + FILE_PATH);
47:
48: while((record = reader.nextRecord()) != null ){
49: System.out.println("name:" + record.getString("name"));
50: System.out.println("staffId:" + record.getString("staffId"));
51: System.out.println("staffSubId:" + record.getString("staffSubId"));
52: System.out.println("registrationDate:" + record.getString("registrationDate"));
53: }
54: }
55:}
|
このサンプルはファイルへの書込み処理(14行目:fileWrite())を行った後、書込んだファイルの読込み(40行目:fileRead())処理を行っています。
■書込み処理
20行目〜25行目:
各項目にデータの設定を行っています。各項目のデータの定義は固定長ファイルライタ設定ファイル(writerConfig2.xml)で行います。このサンプル
での定義内容は次のようになっています。
<field name="name" length="6"/>
21行目のデータ設定処理に対応します。「3.5固定長ファイルアクセス - その1」と同じです。
<field name="staffId" length="10" align="left" padding="0"/>
22行目のデータ設定処理に対応します。align属性はデータの右寄せ左寄せの指定を行います。leftまたはrightを指定することができます。
padding属性は文字埋めの指定を行うことができます。この上記例では0埋めの指定を行っています。
<field name="staffSubId" length="10" patternClass="jp.co.cybec.cb3.sample.file.fixed.FixedWriteFormatter"
type="number" pattern="0000000000" align="right" padding="0"/>
23行目のデータ設定処理に対応します。
この例ではpatternClass属性を使用しています。patternClass属性を使うことで、独自のフォーマット処理クラスを作成することができます。
作成例を以下に示します。
01:public class FixedWriteFormatter implements RecordFieldWriterFormatable {
02: /**
03: * フォーマットを行う - 初めに呼び出される
04: */
05: public String format(String pattern, String type, String data)
06: throws DataFormatException {
07: System.out.println("called format method");
08: System.out.println("pattern:" + pattern + " type:" + type + " data:" + data);
09: System.out.println("");
10:
11: DecimalFormat df = new DecimalFormat();
12: df.applyPattern(pattern);
13:
14: return df.format(new BigDecimal(data));
15: }
16:
17: /**
18: * パディングを行う - formatメソッドの次に呼び出される
19: */
20: public String padding(String length, String algin, String padding, String data)
21: throws DataFormatException {
22: System.out.println("called padding method");
23: System.out.println("length:" + length + " algin:" + algin + " padding:" + padding +
" data:" + data);
24: System.out.println("");
25:
26: return data;
27: }
28:}
|
独自フォーマットクラスを作成するにはRecordFieldWriterFormatableインターフェイスを実装します。このインターフェイスには
format()メソッドとpadding()メソッドが定義され、format()⇒padding()の順で呼び出されます。各メソッドは次のような引数をとります。
String format(String pattern, String type, String data) throws DataFormatException;
String padding(String length, String algin, String padding, String data) throws DataFormatException;
それぞれのメソッドの引数から、設定ファイルの値を取得することができます。戻り値は編集後のデータを戻り値として返します。
<field name="registrationDate" length="10" type="date" pattern="yyyy/MM/dd"/>
25行目のデータ設定処理に対応します。
■読込み処理
49行目〜52行目:
ファイルレコードリーダからデータ1行分のレコードオブジェクトを取得し、読込みデータの取得を行っています。読込みデータの定義は
固定長ファイルリーダ設定ファイル(readerConfig2.xml)で行います。このサンプルでの定義内容は次のようになっています。
<field name="name" length="6"/>
49行目のデータ取得処理に対応しています。length属性で読み込むデータの長さを指定します。
<field name="staffId" length="10" align="left" padding="0"/>
50行目のデータ取得処理に対応しています。length属性で読み込むデータの長さを指定します。align属性は書込みの場合と同様に右寄せ左寄せの
指定を行います。padding属性は書込み処理と違い、読み込んだデータを指定された文字でトリムします。
<field name="staffSubId" length="10" patternClass="jp.co.cybec.cb3.sample.file.fixed.FixedReadFormatter"
type="number" pattern="0000000000" align="right" padding="0"/>
51行目のデータ取得処理に対応しています。ここでも書込み処理と同様にpatternClassを指定しています。読込み処理の場合も
独自のフォーマット処理クラスを作成することができます。
作成例を以下に示します。
01:public class FixedReadFormatter implements RecordFieldReaderFormatable {
02:
03: /**
04: * トリム処理を行うメソッド - 初めに呼び出される
05: */
06: public String trim(String algin, String padding, String data)
07: throws DataFormatException {
08: System.out.println("called trim method");
09: System.out.println("algin:" + algin + " padding:" + padding + " data:" + data);
10: System.out.println("");
11:
12: return data.trim();
13: }
14:
15: /**
16: * フォーマットメソッド - trimメソッドの次に呼び出される
17: */
18: public String format(String pattern, String type, String data)
19: throws DataFormatException {
20: System.out.println("called format method");
21: System.out.println("pattern:" + pattern + " type:" + type + " data:" + data);
22: System.out.println("");
23:
24: return data;
25: }
26:}
|
独自フォーマットクラスを作成するにはRecordFieldReaderFormatableインターフェイスを実装します。このインターフェイスには
trim()メソッドとformat()メソッドが定義され、trim()⇒format()の順で呼び出されます。各メソッドは次のような引数をとります。
String trim(String algin, String padding, String data) throws DataFormatException;
String format(String pattern, String type, String data) throws DataFormatException;
それぞれのメソッドの引数から、設定ファイルの値を取得することができます。戻り値は編集後のデータを戻り値として返します。
<field name="registrationDate" length="10"/>
FixedLengthSample2.javaの52行目に対応します。