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