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 DataRecordFormatterSupport
protected java.util.Map<java.lang.String,DataRecordFormatterSupport.Directive> createDirectiveMap()
createDirectiveMap
in class DataRecordFormatterSupport
public DataRecordFormatter initialize()
initialize
in interface DataRecordFormatter
initialize
in class DataRecordFormatterSupport
public 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 DataRecordFormatterSupport
directive
- ディレクティブpublic void initializeField(java.util.Map<java.lang.String,java.lang.Object> directive)
DataRecordFormatterSupport
では、ディレクティブに設定された以下の値をフィールドに設定する。
FixedLengthDataRecordFormatter
では、ディレクティブまたはコンポーネント設定ファイルに設定された以下の値をフィールドに設定する。
initializeField
in class DataRecordFormatterSupport
directive
- ディレクティブprotected void validateNibble(java.lang.String key, java.lang.String value)
key
- 符号ビットが設定されたディレクティブのキーvalue
- 符号ビットの設定値protected void validateRecordLength(int head, RecordDefinition record)
validateRecordLength
in class DataRecordFormatterSupport
head
- 位置record
- レコード定義情報保持クラスpublic DataRecordFormatterSupport setDataTypeProperty(DataType<?,?> dataType)
null
に変換するかどうかの設定を行う。setDataTypeProperty
in class DataRecordFormatterSupport
dataType
- データタイプ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
true
java.io.IOException
- 入力ストリームの読み込みに失敗した場合