49.7. 4. FixedLengthRecord


FixedLengthRecord アノテーションは、モデルのルートクラスを識別するために使用されます。これはレコードを表し、"固定長フォーマットのデータが含まれるファイル/メッセージの行" であり、複数の子モデルクラスにリンクできます。フィールドのデータは右または左に位置合わせできるため、この形式は特殊です。

データのサイズがフィールドの長さを完全に満たしていない場合は、'埋め込み' 文字を追加できます。

Expand
アノテーション名レコードの種類レベル

FixedLengthRecord

固定:

クラス

Expand
パラメーター名type必須デフォルト値Info

countGrapheme

boolean

 

false

文字のカウント方法を示します。

crlf

string

 

WINDOWS

各レコードの後に改行を追加するために使用する文字 (オプション)。使用可能な値: WINDOWS、UNIX、MAC、またはカスタム。このオプションはマーシャリング中にのみ使用されますが、アンマーシャリングでは、eol がカスタマイズされていない限り、JDK が提供するシステムのデフォルトの行区切り文字が使用されます。

eol

string

  

アンマーシャリング中に各レコードの後に行末を考慮して処理するために使用される文字 (オプション - デフォルト = "" は、他の行区切り文字が提供されない限り、JDK が提供するデフォルトの行区切り文字を使用するのに役立ちます)。このオプションは、アンマーシャリング中にのみ使用されます。マーシャリングでは、他の値が指定されていない限り、システムのデフォルトで提供される行区切り文字を "WINDOWS" として使用します。

footer

クラス

 

void

このタイプのレコードでは、ファイルの最後に単一のフッターレコードが続く可能性があることを示しています。

header

   

このタイプのレコードでは、ファイルの先頭に単一のヘッダーレコードがある可能性があることを示しています。

ignoreMissingChars

   

短すぎる行を無視するかどうかを示します

ignoreTrailingChars

   

アンマーシャリング/解析時に、最後にマップされたフィールドを超える文字を無視できることを示します。このアノテーションは、モデルのルートクラスに関連付けられており、一度宣言する必要があります。

長さ

int

 

0

レコードの固定長 (文字数)。これは、デフォルトでレコードが常に {#paddingChar()} でパディングされた長さになることを意味します。

name

String

  

レコードを説明する名前 (オプション)

paddingChar

char

  

パディングする文字。

skipFooter

boolean

 

false

フッターレコードのマーシャリング/アンマーシャリングをスキップするようにデータ形式を設定します。(ヘッダーやフッターではなく) プライマリーレコードでこのパラメーターを設定します。

skipHeader

boolean

 

false

ヘッダーレコードのマーシャリング/アンマーシャリングをスキップするようにデータ形式を設定します。プライマリーレコードでこのパラメーターを設定します (たとえば、ヘッダーやフッターではありません)。

レコードは、ヘッダー/フッターと、プライマリーの固定長レコードを両方に指定できません。

ケース 1: 単純な固定長レコード

この単純な例は、固定メッセージを解析/フォーマットするモデル設計方法を示しています。

10A9PaulineMISINXD12345678BUYShare2500.45USD01-08-2009

Fixed-simple

@FixedLengthRecord(length=54, paddingChar=' ')
public static class Order {

    @DataField(pos = 1, length=2)
    private int orderNr;

    @DataField(pos = 3, length=2)
    private String clientNr;

    @DataField(pos = 5, length=7)
    private String firstName;

    @DataField(pos = 12, length=1, align="L")
    private String lastName;

    @DataField(pos = 13, length=4)
    private String instrumentCode;

    @DataField(pos = 17, length=10)
    private String instrumentNumber;

    @DataField(pos = 27, length=3)
    private String orderType;

    @DataField(pos = 30, length=5)
    private String instrumentType;

    @DataField(pos = 35, precision = 2, length=7)
    private BigDecimal amount;

    @DataField(pos = 42, length=3)
    private String currency;

    @DataField(pos = 45, length=10, pattern = "dd-MM-yyyy")
    private Date orderDate;
}

ケース 2: アラインメントとパディングのある固定長レコード

こちらの詳細な例は、フィールドの配置を定義する方法と、このケースでは ' ' であるパディング文字を割り当てる方法を示しています。

10A9 PaulineM ISINXD12345678BUYShare2500.45USD01-08-2009

Fixed-padding-align

@FixedLengthRecord(length=60, paddingChar=' ')
public static class Order {

    @DataField(pos = 1, length=2)
    private int orderNr;

    @DataField(pos = 3, length=2)
    private String clientNr;

    @DataField(pos = 5, length=9)
    private String firstName;

    @DataField(pos = 14, length=5, align="L")   // align text to the LEFT zone of the block
    private String lastName;

    @DataField(pos = 19, length=4)
    private String instrumentCode;

    @DataField(pos = 23, length=10)
    private String instrumentNumber;

    @DataField(pos = 33, length=3)
    private String orderType;

    @DataField(pos = 36, length=5)
    private String instrumentType;

    @DataField(pos = 41, precision = 2, length=7)
    private BigDecimal amount;

    @DataField(pos = 48, length=3)
    private String currency;

    @DataField(pos = 51, length=10, pattern = "dd-MM-yyyy")
    private Date orderDate;
}

ケース 3: フィールドパディング

' ' の代わりに '0' をパディングする数値形式があるため、レコードに定義されたデフォルトのパディングをフィールドに適用できない場合があります。この場合、モデルで @DataField の属性 paddingChar を使用して、この値を設定できます。

10A9 PaulineM ISINXD12345678BUYShare000002500.45USD01-08-2009

Fixed-padding-field

@FixedLengthRecord(length = 65, paddingChar = ' ')
public static class Order {

    @DataField(pos = 1, length = 2)
    private int orderNr;

    @DataField(pos = 3, length = 2)
    private String clientNr;

    @DataField(pos = 5, length = 9)
    private String firstName;

    @DataField(pos = 14, length = 5, align = "L")
    private String lastName;

    @DataField(pos = 19, length = 4)
    private String instrumentCode;

    @DataField(pos = 23, length = 10)
    private String instrumentNumber;

    @DataField(pos = 33, length = 3)
    private String orderType;

    @DataField(pos = 36, length = 5)
    private String instrumentType;

    @DataField(pos = 41, precision = 2, length = 12, paddingChar = '0')
    private BigDecimal amount;

    @DataField(pos = 53, length = 3)
    private String currency;

    @DataField(pos = 56, length = 10, pattern = "dd-MM-yyyy")
    private Date orderDate;
}

ケース 4: 区切り文字付きの固定長レコード

固定長レコードでは、レコード内のコンテンツが区切られている場合があります。以下の例では、firstName フィールドおよび lastName フィールドは ^ 文字で区切られています。

10A9Pauline^M^ISINXD12345678BUYShare000002500.45USD01-08-2009

Fixed-delimited

@FixedLengthRecord
public static class Order {

    @DataField(pos = 1, length = 2)
    private int orderNr;

    @DataField(pos = 2, length = 2)
    private String clientNr;

    @DataField(pos = 3, delimiter = "^")
    private String firstName;

    @DataField(pos = 4, delimiter = "^")
    private String lastName;

    @DataField(pos = 5, length = 4)
    private String instrumentCode;

    @DataField(pos = 6, length = 10)
    private String instrumentNumber;

    @DataField(pos = 7, length = 3)
    private String orderType;

    @DataField(pos = 8, length = 5)
    private String instrumentType;

    @DataField(pos = 9, precision = 2, length = 12, paddingChar = '0')
    private BigDecimal amount;

    @DataField(pos = 10, length = 3)
    private String currency;

    @DataField(pos = 11, length = 10, pattern = "dd-MM-yyyy")
    private Date orderDate;
}

固定長レコードの pos 値は、オプションで、正確な列番号の代わりに序数の連続した値を使用して定義できます。

ケース 5: レコード定義フィールド長の固定長レコード

固定長レコードには、同じレコード内の別のフィールドで想定される長さを定義するフィールドが含まれる場合があります。次の例では、instrumentNumber フィールド値の長さは、レコード内の instrumentNumberLen フィールドの値によって定義されます。

10A9Pauline^M^ISIN10XD12345678BUYShare000002500.45USD01-08-2009

Fixed-delimited

@FixedLengthRecord
public static class Order {

    @DataField(pos = 1, length = 2)
    private int orderNr;

    @DataField(pos = 2, length = 2)
    private String clientNr;

    @DataField(pos = 3, delimiter = "^")
    private String firstName;

    @DataField(pos = 4, delimiter = "^")
    private String lastName;

    @DataField(pos = 5, length = 4)
    private String instrumentCode;

    @DataField(pos = 6, length = 2, align = "R", paddingChar = '0')
    private int instrumentNumberLen;

    @DataField(pos = 7, lengthPos=6)
    private String instrumentNumber;

    @DataField(pos = 8, length = 3)
    private String orderType;

    @DataField(pos = 9, length = 5)
    private String instrumentType;

    @DataField(pos = 10, precision = 2, length = 12, paddingChar = '0')
    private BigDecimal amount;

    @DataField(pos = 11, length = 3)
    private String currency;

    @DataField(pos = 12, length = 10, pattern = "dd-MM-yyyy")
    private Date orderDate;
}

ケース 6: ヘッダーとフッター付きの固定長レコード

Bindy は、モデルの一部として設定されている固定長のヘッダーおよびフッターレコードを検出します。ただし、アノテーション付きのクラスが、プライマリー @FixedLengthRecord クラスと同じパッケージに存在するか、設定されたスキャンパッケージの 1 つに含まれている必要があります。次のテキストは、ヘッダーレコードとフッターレコードで囲まれた 2 つの固定長レコードを示しています。

101-08-2009
10A9 PaulineM ISINXD12345678BUYShare000002500.45USD01-08-2009
10A9 RichN ISINXD12345678BUYShare000002700.45USD01-08-2009
9000000002

Fixed-header-and-footer-main-class

@FixedLengthRecord(header = OrderHeader.class, footer = OrderFooter.class)
public class Order {

    @DataField(pos = 1, length = 2)
    private int orderNr;

    @DataField(pos = 2, length = 2)
    private String clientNr;

    @DataField(pos = 3, length = 9)
    private String firstName;

    @DataField(pos = 4, length = 5, align = "L")
    private String lastName;

    @DataField(pos = 5, length = 4)
    private String instrumentCode;

    @DataField(pos = 6, length = 10)
    private String instrumentNumber;

    @DataField(pos = 7, length = 3)
    private String orderType;

    @DataField(pos = 8, length = 5)
    private String instrumentType;

    @DataField(pos = 9, precision = 2, length = 12, paddingChar = '0')
    private BigDecimal amount;

    @DataField(pos = 10, length = 3)
    private String currency;

    @DataField(pos = 11, length = 10, pattern = "dd-MM-yyyy")
    private Date orderDate;
}

@FixedLengthRecord
public  class OrderHeader {
    @DataField(pos = 1, length = 1)
    private int recordType = 1;

    @DataField(pos = 2, length = 10, pattern = "dd-MM-yyyy")
    private Date recordDate;
}

@FixedLengthRecord
public class OrderFooter {

    @DataField(pos = 1, length = 1)
    private int recordType = 9;

    @DataField(pos = 2, length = 9, align = "R", paddingChar = '0')
    private int numberOfRecordsInTheFile;
}

ケース 7: 固定長レコードの解析時にコンテンツをスキップする。

ターゲットユースケースに必要以上の情報を含む、固定長レコードを提供するシステムと統合するのが一般的です。この状況では、不要なフィールドの宣言と解析をスキップすると便利です。これに対応するために、次に宣言されたフィールドの pos 値が最後に解析されたフィールドのカーソル位置を超えている場合には、Bindy により、レコード内で次にマップされたフィールドに移動されます。対象のフィールドに (順序値ではなく) 絶対位置を使用すると、Bindy は 2 つのフィールド間のコンテンツをスキップします。

同様に、先のフィールドに対象となるコンテンツがない場合があります。この場合には、@FixedLengthRecord 宣言で ignoreTrailingChars プロパティーを設定して、最後にマップされたフィールド以降のすべての解析をスキップするように Bindy に指示できます。

@FixedLengthRecord(ignoreTrailingChars = true)
public static class Order {

    @DataField(pos = 1, length = 2)
    private int orderNr;

    @DataField(pos = 3, length = 2)
    private String clientNr;

    // any characters that appear beyond the last mapped field will be ignored

}
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2026 Red Hat
トップに戻る