public class FixedLengthDataRecordFormatter extends DataRecordFormatterSupport
本クラスはスレッドセーフを考慮した実装にはなっていないので、呼び出し元で同期化の制御を行うこと。
ディレクティブの設定固定長ファイルデータを読み込む際は、以下のディレクティブの設定が必須となる。
また、任意で以下のディレクティブの設定を行うことができる。
レコード終端文字列は、許容する文字列のみ指定できる。
デフォルトでは「\n」「\r」「\r\n」の3種類の文字列をレコード終端文字列として許容するが、
それを変更したい場合は、任意の許容する文字列のリストをFormatterFactoryクラスのallowedRecordSeparatorListプロパティに設定すること。
ゾーンおよびパック数値の符号ビットは、フィールド単位のみでなく、ファイル単位およびシステム単位でも指定できる。
「フィールド単位 > ファイル単位 > システム単位」の優先度順で、使用する符号ビットが決定される。
符号ビットをファイル単位で指定する場合はディレクティブ、システム単位で指定する場合はコンポーネント設定ファイルで定義する。
数値文字列のディレクティブについての詳細は
NumberStringDecimalの
Javadocを参照すること。
| Modifier and Type | Class and Description |
|---|---|
static class |
FixedLengthDataRecordFormatter.FixedLengthDirective
固定長ファイルフォーマッタが使用するディレクティブの名前と値の型。
以下に一覧を示す。
positive-zone-sign-nibble:String negative-zone-sign-nibble:String positive-pack-sign-nibble:String negative-pack-sign-nibble:String fixed-sign-position:Boolean required-plus-sign:Boolean |
DataRecordFormatterSupport.Directive| Constructor and Description |
|---|
FixedLengthDataRecordFormatter()
デフォルトコンストラクタ。
デフォルトでは、FixedLengthConvertorSettingをコンバータとして使用する。
|
| Modifier and Type | Method and Description |
|---|---|
void |
close()
内部的に保持している各種リソースを開放する。
|
protected java.lang.Object |
convertToField(byte[] source,
FieldDefinition field)
入力ストリームから1レコード分のフィールドの内容を読み込み、コンバータを用いて変換したオブジェクトを返却する。
入力ストリームが既に終端に達していた場合はnullを返却する。
|
protected DataRecord |
convertToRecord(byte[] bytes,
RecordDefinition recordDef)
1レコード分の固定長レコードを読み込み、
DataRecord型のオブジェクトとして返却する。
入力ストリームが既に終端に達していた場合はnullを返却する。
|
protected java.util.Map<java.lang.String,DataRecordFormatterSupport.Directive> |
createDirectiveMap()
使用するディレクティブの名前とDirectiveのMapを生成する。
サブクラスで使用するディレクティブを追加する場合は、本メソッドをオーバーライドし、任意のディレクティブを追加すること。
|
protected void |
determinePackNibble(java.util.Map<java.lang.String,java.lang.Object> directive)
パックNibbleと、それぞれの符号ビットの設定を行う。
|
protected void |
determineZoneNibble(java.util.Map<java.lang.String,java.lang.Object> directive)
ゾーンNibbleおよび符号ビットの設定を行う。
|
ConvertorSetting |
getConvertorSetting()
固定長データのコンバータの設定情報保持クラスを取得する。
|
boolean |
hasNext()
次に読み込む行の有無を判定する。
|
DataRecordFormatter |
initialize()
フォーマット定義情報保持クラスの初期化を行う。
初期化は本メソッドの1回目の実行時のみ行われ、2回目以降の実行時に初期化は行われない。
|
void |
initializeField(java.util.Map<java.lang.String,java.lang.Object> directive)
フィールドを初期化する。
DataRecordFormatterSupportでは、ディレクティブに設定された以下の値をフィールドに設定する。
レコード終端文字列
文字エンコーディング
|
DataRecord |
readRecord()
入力ストリームから1レコード分のデータを読み込み、データレコードを返却する。
入力ストリームが既に終端に達していた場合は
nullを返却する。 |
DataRecordFormatterSupport |
setDataTypeProperty(DataType<?,?> dataType)
ゾーン/パック数値の符号ビットの設定および、
数値文字列の小数点の要否、符号位置の固定/非固定、正の符号の要否の設定を行う。
また、各データタイプに空文字列を
nullに変換するかどうかの設定を行う。 |
DataRecordFormatter |
setInputStream(java.io.InputStream stream)
入力ストリームを設定する。
|
DataRecordFormatter |
setOutputStream(java.io.OutputStream stream)
出力ストリームを設定する。
|
protected void |
validateDirectives(java.util.Map<java.lang.String,java.lang.Object> directive)
ディレクティブの内容の妥当性を検証する。
|
protected void |
validateNibble(java.lang.String key,
java.lang.String value)
符号ビットが半角英数字で構成されているか検証する。
|
protected void |
validateRecordLength(int head,
RecordDefinition record)
レコード長の妥当性を検証する。
|
protected void |
writeField(java.util.Map<java.lang.String,?> record,
FieldDefinition field)
このオブジェクトのフォーマット定義に従って、
出力ストリームにフィールドの内容を書き込む。
|
void |
writeRecord(java.util.Map<java.lang.String,?> record)
出力ストリームに1レコード分の内容を書き込む。
出力時に使用するデータレイアウト(レコードタイプ)は、
Mapの内容をもとに自動的に判定される。
引数がDataRecord型かつレコードタイプが指定されている場合、
フォーマット定義ファイルのレコードタイプ識別フィールド定義よりも、指定されたレコードタイプを優先して書き込みを行う。 |
protected void |
writeRecord(java.util.Map<java.lang.String,?> record,
RecordDefinition recordDef)
このオブジェクトのフォーマット情報に従って、
出力ストリームに1レコード分の内容を書き込む。
|
void |
writeRecord(java.lang.String recordType,
java.util.Map<java.lang.String,?> record)
指定したデータレイアウト(レコードタイプ)で、出力ストリームに1レコード分の内容を書き込む。
|
addConvertorToField, addFormatAndRecordNumberTo, createCharacterReplacer, getDefaultEncoding, getDefinition, getFileType, getMimeType, getRecordNumber, getRecordSeparator, incrementRecordNumber, initializeClassifier, initializeDefinition, initializeFieldDefinition, newInvalidDataFormatException, setAllowedRecordSeparatorList, setDefaultReplacementType, setDefinition, setFieldProperty, setRecordNumber, setValueConvertorProperty, validateDirectivesDataType, validatePosition@Published(tag="architect") public FixedLengthDataRecordFormatter()
public ConvertorSetting getConvertorSetting()
getConvertorSetting in class DataRecordFormatterSupportprotected java.util.Map<java.lang.String,DataRecordFormatterSupport.Directive> createDirectiveMap()
createDirectiveMap in class DataRecordFormatterSupportpublic DataRecordFormatter initialize()
initialize in interface DataRecordFormatterinitialize in class DataRecordFormatterSupportpublic DataRecordFormatter setInputStream(java.io.InputStream stream)
stream - 入力ストリームpublic DataRecordFormatter setOutputStream(java.io.OutputStream stream)
stream - 出力ストリームprotected void validateDirectives(java.util.Map<java.lang.String,java.lang.Object> directive)
サブクラスで独自のディレクティブを使用する場合は、このメソッドをオーバーライドし、独自のディレクティブに対して妥当性検証を行うこと。
DataRecordFormatterでは以下の仕様を満たしているかどうかの検証を行う。
妥当性検証に失敗した場合は、SyntaxErrorExceptionがスローされる。
validateDirectives in class DataRecordFormatterSupportdirective - ディレクティブpublic void initializeField(java.util.Map<java.lang.String,java.lang.Object> directive)
DataRecordFormatterSupportでは、ディレクティブに設定された以下の値をフィールドに設定する。
FixedLengthDataRecordFormatterでは、ディレクティブまたはコンポーネント設定ファイルに設定された以下の値をフィールドに設定する。
initializeField in class DataRecordFormatterSupportdirective - ディレクティブprotected void validateNibble(java.lang.String key,
java.lang.String value)
key - 符号ビットが設定されたディレクティブのキーvalue - 符号ビットの設定値protected void validateRecordLength(int head,
RecordDefinition record)
validateRecordLength in class DataRecordFormatterSupporthead - 位置record - レコード定義情報保持クラスpublic DataRecordFormatterSupport setDataTypeProperty(DataType<?,?> dataType)
nullに変換するかどうかの設定を行う。setDataTypeProperty in class DataRecordFormatterSupportdataType - データタイプpublic DataRecord readRecord() throws java.io.IOException, InvalidDataFormatException
nullを返却する。java.io.IOException - 入力ストリームの読み込みに失敗した場合InvalidDataFormatException - 読み込んだデータがフォーマット定義に違反している場合protected DataRecord convertToRecord(byte[] bytes, RecordDefinition recordDef) throws java.io.IOException
bytes - 入力データrecordDef - レコード定義情報保持クラスjava.io.IOException - 読み込みに伴うIO処理で問題が発生した場合。protected java.lang.Object convertToField(byte[] source,
FieldDefinition field)
throws java.io.IOException
source - 入力ストリームfield - フィールド定義情報保持クラスjava.io.IOException - 読み込みに伴うIO処理で問題が発生した場合。public void writeRecord(java.util.Map<java.lang.String,?> record)
throws java.io.IOException,
InvalidDataFormatException
Mapの内容をもとに自動的に判定される。
引数がDataRecord型かつレコードタイプが指定されている場合、
フォーマット定義ファイルのレコードタイプ識別フィールド定義よりも、指定されたレコードタイプを優先して書き込みを行う。record - 出力するレコードの内容を格納したMapjava.io.IOException - 出力ストリームの書き込みに失敗した場合InvalidDataFormatException - 書き込むデータの内容がフォーマット定義に違反している場合public void writeRecord(java.lang.String recordType,
java.util.Map<java.lang.String,?> record)
throws java.io.IOException
recordType - レコードタイプrecord - 出力するレコードの内容を格納したMapjava.io.IOException - 出力ストリームの書き込みに失敗した場合protected void writeRecord(java.util.Map<java.lang.String,?> record,
RecordDefinition recordDef)
throws java.io.IOException
record - 出力するレコードの内容を格納したMaprecordDef - レコード定義情報保持クラスjava.io.IOException - 書き込みに伴うIO処理で問題が発生した場合。protected void writeField(java.util.Map<java.lang.String,?> record,
FieldDefinition field)
throws java.io.IOException
record - 出力するレコードの内容を格納したMapfield - フィールド定義情報保持クラスjava.io.IOException - 書き込みに伴うIO処理で問題が発生した場合。protected void determineZoneNibble(java.util.Map<java.lang.String,java.lang.Object> directive)
ゾーンNibbleは使用するエンコーディングに従って決定する。
システム単位で使用する符号ビットはコンポーネント設定ファイルに、
ファイル単位で使用する符号ビットはフォーマット定義ファイルのディレクティブに定義する。
「ファイル単位>システム単位」の優先度順で使用する符号ビットが決定される。
システム単位およびファイル単位、どちらにも符号ビットが定義されていない場合は、以下の既定値を使用する。
- ascii互換のエンコーディングを使用する場合
正) 0x30 負) 0x70
- ebcdic互換のエンコーディングを使用する場合
正) 0xC0 負) 0xD0
もしフィールド単位で符号ビットが設定された場合は、それが最優先で符号ビットとして使用される。
directive - ディレクティブprotected void determinePackNibble(java.util.Map<java.lang.String,java.lang.Object> directive)
パックNibbleは使用するエンコーディングに従って決定する。
システム単位で使用する符号ビットはコンポーネント設定ファイルに、
ファイル単位で使用する符号ビットはフォーマット定義ファイルのディレクティブに定義する。
「ファイル単位>システム単位」の優先度順で使用する符号ビットが決定される。
システム単位およびファイル単位、どちらにも符号ビットが定義されていない場合は、以下の既定値を使用する。
- ascii互換のエンコーディングを使用する場合
正) 0x03 負) 0x07
- ebcdic互換のエンコーディングを使用する場合
正) 0x0C 負) 0x0D
もしフィールド単位で符号ビットが設定された場合は、それが最優先で符号ビットとして使用される。
directive - ディレクティブpublic void close()
setInputStream(java.io.InputStream)メソッドおよびsetOutputStream(java.io.OutputStream)メソッドで渡されたストリームをクローズする。public boolean hasNext()
throws java.io.IOException
truejava.io.IOException - 入力ストリームの読み込みに失敗した場合