Class FixedLengthDataRecordFormatter

java.lang.Object
nablarch.core.dataformat.DataRecordFormatterSupport
nablarch.core.dataformat.FixedLengthDataRecordFormatter
All Implemented Interfaces:
Closeable, AutoCloseable, DataRecordFormatter

public class FixedLengthDataRecordFormatter extends DataRecordFormatterSupport
フォーマット定義ファイルの内容に従い、固定長ファイルデータの読み書きを行うクラス。

本クラスはスレッドセーフを考慮した実装にはなっていないので、呼び出し元で同期化の制御を行うこと。

ディレクティブの設定

固定長ファイルデータを読み込む際は、以下のディレクティブの設定が必須となる。

  • ファイルの文字エンコーディング
  • レコード長

また、任意で以下のディレクティブの設定を行うことができる。

  • レコード終端文字列(\n、\r、\r\nなど)
  • ゾーン数値、パック数値の符号ビット(正)
  • ゾーン数値、パック数値の符号ビット(負)
  • 数値文字列の小数点の要否
  • 数値文字列の符号位置の固定/非固定
  • 数値文字列の正の符号の必須/非必須

レコード終端文字列は、許容する文字列のみ指定できる。
デフォルトでは「\n」「\r」「\r\n」の3種類の文字列をレコード終端文字列として許容するが、 それを変更したい場合は、任意の許容する文字列のリストをFormatterFactoryクラスのallowedRecordSeparatorListプロパティに設定すること。

ゾーンおよびパック数値の符号ビットは、フィールド単位のみでなく、ファイル単位およびシステム単位でも指定できる。
「フィールド単位 > ファイル単位 > システム単位」の優先度順で、使用する符号ビットが決定される。
符号ビットをファイル単位で指定する場合はディレクティブ、システム単位で指定する場合はコンポーネント設定ファイルで定義する。

数値文字列のディレクティブについての詳細は NumberStringDecimalの Javadocを参照すること。

  • Constructor Details

    • FixedLengthDataRecordFormatter

      @Published(tag="architect") public FixedLengthDataRecordFormatter()
      デフォルトコンストラクタ。 デフォルトでは、FixedLengthConvertorSettingをコンバータとして使用する。
  • Method Details

    • getConvertorSetting

      public ConvertorSetting getConvertorSetting()
      固定長データのコンバータの設定情報保持クラスを取得する。
      Specified by:
      getConvertorSetting in class DataRecordFormatterSupport
      Returns:
      固定長データのコンバータの設定情報保持クラス
    • createDirectiveMap

      protected Map<String,DataRecordFormatterSupport.Directive> createDirectiveMap()
      使用するディレクティブの名前とDirectiveのMapを生成する。 サブクラスで使用するディレクティブを追加する場合は、本メソッドをオーバーライドし、任意のディレクティブを追加すること。
      Overrides:
      createDirectiveMap in class DataRecordFormatterSupport
      Returns:
      使用するディレクティブの名前と値の型のMap
    • initialize

      public DataRecordFormatter initialize()
      フォーマット定義情報保持クラスの初期化を行う。 初期化は本メソッドの1回目の実行時のみ行われ、2回目以降の実行時に初期化は行われない。
      Specified by:
      initialize in interface DataRecordFormatter
      Overrides:
      initialize in class DataRecordFormatterSupport
      Returns:
      このオブジェクト自体
    • setInputStream

      public DataRecordFormatter setInputStream(InputStream stream)
      入力ストリームを設定する。
      Parameters:
      stream - 入力ストリーム
      Returns:
      本クラスのインスタンス
    • setOutputStream

      public DataRecordFormatter setOutputStream(OutputStream stream)
      出力ストリームを設定する。
      Parameters:
      stream - 出力ストリーム
      Returns:
      本クラスのインスタンス
    • validateDirectives

      protected void validateDirectives(Map<String,Object> directive)
      ディレクティブの内容の妥当性を検証する。

      サブクラスで独自のディレクティブを使用する場合は、このメソッドをオーバーライドし、独自のディレクティブに対して妥当性検証を行うこと。

      DataRecordFormatterでは以下の仕様を満たしているかどうかの検証を行う。

      • ディレクティブの値のデータ型が正しい
      • ファイルタイプが定義されている
      • エンコーディングが定義されている
      • エンコーディングがCharset型に変換できる
      • レコード終端文字列が許容されている文字である

      妥当性検証に失敗した場合は、SyntaxErrorExceptionがスローされる。

      この実装では、以下の検証を行う。
      • ディレクティブの値のデータ型が正しいこと
      • 符号ビットの形式が正しいこと
      Overrides:
      validateDirectives in class DataRecordFormatterSupport
      Parameters:
      directive - ディレクティブ
    • initializeField

      public void initializeField(Map<String,Object> directive)
      フィールドを初期化する。

      DataRecordFormatterSupportでは、ディレクティブに設定された以下の値をフィールドに設定する。

      • レコード終端文字列
      • 文字エンコーディング

      FixedLengthDataRecordFormatterでは、ディレクティブまたはコンポーネント設定ファイルに設定された以下の値をフィールドに設定する。

      • 1レコードあたりのバイト長
      • レコード終端文字列(バイト)
      • ゾーンNibbleと符号ビット
      • パックNibbleと符号ビット
      • 数値項目の小数点の要否
      • 数値項目の正の符号の要否
      • 数値項目の符号位置の固定/非固定
      Overrides:
      initializeField in class DataRecordFormatterSupport
      Parameters:
      directive - ディレクティブ
    • validateNibble

      protected void validateNibble(String key, String value)
      符号ビットが半角英数字で構成されているか検証する。
      Parameters:
      key - 符号ビットが設定されたディレクティブのキー
      value - 符号ビットの設定値
    • validateRecordLength

      protected void validateRecordLength(int head, RecordDefinition record)
      レコード長の妥当性を検証する。 この実装では、固定長フィールドの合計の長さが、ディレクティブで定義されたレコード長と一致するか検証する。
      Overrides:
      validateRecordLength in class DataRecordFormatterSupport
      Parameters:
      head - 位置
      record - レコード定義情報保持クラス
    • setDataTypeProperty

      public DataRecordFormatterSupport setDataTypeProperty(DataType<?,?> dataType)
      ゾーン/パック数値の符号ビットの設定および、 数値文字列の小数点の要否、符号位置の固定/非固定、正の符号の要否の設定を行う。 また、各データタイプに空文字列をnullに変換するかどうかの設定を行う。
      Overrides:
      setDataTypeProperty in class DataRecordFormatterSupport
      Parameters:
      dataType - データタイプ
      Returns:
      自分自身
    • readRecord

      public DataRecord readRecord() throws IOException, InvalidDataFormatException
      入力ストリームから1レコード分のデータを読み込み、データレコードを返却する。 入力ストリームが既に終端に達していた場合はnullを返却する。
      Returns:
      データレコード
      Throws:
      IOException - 入力ストリームの読み込みに失敗した場合
      InvalidDataFormatException - 読み込んだデータがフォーマット定義に違反している場合
    • convertToRecord

      protected DataRecord convertToRecord(byte[] bytes, RecordDefinition recordDef) throws IOException
      1レコード分の固定長レコードを読み込み、 DataRecord型のオブジェクトとして返却する。 入力ストリームが既に終端に達していた場合はnullを返却する。
      Parameters:
      bytes - 入力データ
      recordDef - レコード定義情報保持クラス
      Returns:
      読み込んだレコード
      Throws:
      IOException - 読み込みに伴うIO処理で問題が発生した場合。
    • convertToField

      protected Object convertToField(byte[] source, FieldDefinition field) throws IOException
      入力ストリームから1レコード分のフィールドの内容を読み込み、コンバータを用いて変換したオブジェクトを返却する。 入力ストリームが既に終端に達していた場合はnullを返却する。
      Parameters:
      source - 入力ストリーム
      field - フィールド定義情報保持クラス
      Returns:
      読み込んだフィールドの内容
      Throws:
      IOException - 読み込みに伴うIO処理で問題が発生した場合。
    • writeRecord

      public void writeRecord(Map<String,?> record) throws IOException, InvalidDataFormatException
      出力ストリームに1レコード分の内容を書き込む。

      出力時に使用するデータレイアウト(レコードタイプ)は、Mapの内容をもとに自動的に判定される。

      引数がDataRecord型かつレコードタイプが指定されている場合、 フォーマット定義ファイルのレコードタイプ識別フィールド定義よりも、指定されたレコードタイプを優先して書き込みを行う。

      Parameters:
      record - 出力するレコードの内容を格納したMap
      Throws:
      IOException - 出力ストリームの書き込みに失敗した場合
      InvalidDataFormatException - 書き込むデータの内容がフォーマット定義に違反している場合
    • writeRecord

      public void writeRecord(String recordType, Map<String,?> record) throws IOException
      指定したデータレイアウト(レコードタイプ)で、出力ストリームに1レコード分の内容を書き込む。
      Parameters:
      recordType - レコードタイプ
      record - 出力するレコードの内容を格納したMap
      Throws:
      IOException - 出力ストリームの書き込みに失敗した場合
    • writeRecord

      protected void writeRecord(Map<String,?> record, RecordDefinition recordDef) throws IOException
      このオブジェクトのフォーマット情報に従って、 出力ストリームに1レコード分の内容を書き込む。
      Parameters:
      record - 出力するレコードの内容を格納したMap
      recordDef - レコード定義情報保持クラス
      Throws:
      IOException - 書き込みに伴うIO処理で問題が発生した場合。
    • writeField

      protected void writeField(Map<String,?> record, FieldDefinition field) throws IOException
      このオブジェクトのフォーマット定義に従って、 出力ストリームにフィールドの内容を書き込む。
      Parameters:
      record - 出力するレコードの内容を格納したMap
      field - フィールド定義情報保持クラス
      Throws:
      IOException - 書き込みに伴うIO処理で問題が発生した場合。
    • determineZoneNibble

      protected void determineZoneNibble(Map<String,Object> directive)
      ゾーンNibbleおよび符号ビットの設定を行う。

      ゾーンNibbleは使用するエンコーディングに従って決定する。

      システム単位で使用する符号ビットはコンポーネント設定ファイルに、 ファイル単位で使用する符号ビットはフォーマット定義ファイルのディレクティブに定義する。
      「ファイル単位>システム単位」の優先度順で使用する符号ビットが決定される。
      システム単位およびファイル単位、どちらにも符号ビットが定義されていない場合は、以下の既定値を使用する。

       - ascii互換のエンコーディングを使用する場合
           正) 0x30 負) 0x70
       - ebcdic互換のエンコーディングを使用する場合
           正) 0xC0 負) 0xD0
       
      もしフィールド単位で符号ビットが設定された場合は、それが最優先で符号ビットとして使用される。

      Parameters:
      directive - ディレクティブ
    • determinePackNibble

      protected void determinePackNibble(Map<String,Object> directive)
      パックNibbleと、それぞれの符号ビットの設定を行う。

      パックNibbleは使用するエンコーディングに従って決定する。

      システム単位で使用する符号ビットはコンポーネント設定ファイルに、 ファイル単位で使用する符号ビットはフォーマット定義ファイルのディレクティブに定義する。
      「ファイル単位>システム単位」の優先度順で使用する符号ビットが決定される。
      システム単位およびファイル単位、どちらにも符号ビットが定義されていない場合は、以下の既定値を使用する。

       - ascii互換のエンコーディングを使用する場合
           正) 0x03 負) 0x07
       - ebcdic互換のエンコーディングを使用する場合
           正) 0x0C 負) 0x0D
       
      もしフィールド単位で符号ビットが設定された場合は、それが最優先で符号ビットとして使用される。

      Parameters:
      directive - ディレクティブ
    • close

      public void close()
      内部的に保持している各種リソースを開放する。 この実装では、setInputStream(java.io.InputStream)メソッドおよびsetOutputStream(java.io.OutputStream)メソッドで渡されたストリームをクローズする。
    • hasNext

      public boolean hasNext() throws IOException
      次に読み込む行の有無を判定する。
      Returns:
      次に読み込む行がある場合true
      Throws:
      IOException - 入力ストリームの読み込みに失敗した場合