49.7. 4.FixedLengthRecord


FixedLengthRecord 注解用于识别模型的根类。它代表一个记录,它"文件/消息的行包含数据固定长度格式",并可链接到多个子模型类。这个格式是特定的,因为字段的数据可以与右侧或左侧一致。

当数据的大小没有完全填写字段长度时,我们可以添加"本"字符。

Expand
注解名称记录类型级别

FixedLengthRecord

已修复

Expand
参数名称type必需默认值info

countGrapheme

布尔值

 

false

指明如何计算收费。

crlf

字符串

 

WINDOWS

要在每个记录后添加回车字符(可选)。可能的值有:WINDOWS、UNIX、MAC 或 custom。这个选项仅在 marshalling 期间使用,而 unmarshalling 使用系统默认 JDK 提供的行分隔符,除非自定义 eol。

eol

字符串

  

要在每个记录后考虑行尾的字符(可选)(可选 - default = "",它可以帮助默认 JDK 提供的行分隔符使用,除非提供了任何其他行分隔符)。这个选项仅在 unmarshalling 期间使用,其中 marshalling 使用系统默认提供的行分隔符为"WINDOWS",除非提供了任何其他值。

footer

 

void

表示此类型的记录可以跟随文件末尾的单个页脚记录。

header

   

表示此类型的记录前面可以加上文件开头的单个标头记录。

ignoreMissingChars

   

指明是否忽略太短行

ignoreTrailingChars

   

表示在 unmarshalling / 解析时会忽略最后一个映射文件之外的字符。此注释与模型的根类关联,必须声明一次。

length

int

 

0

记录的固定长度(字符数)。这意味着,默认情况下,记录将始终为使用 {#paddingChar ()} 的长期添加。

name

字符串

  

描述记录的名称(可选)。

paddingChar

char

  

使用 char to pad。

skipFooter

布尔值

 

false

配置数据格式,以跳过页脚记录的 marshalling / unmarshalling,在主记录上配置此参数(例如,而不是标头或页脚)。

skipHeader

布尔值

 

false

配置数据格式,以跳过标头记录的 marshalling / unmarshalling。在主记录上配置此参数(例如,不是标头或页脚)。

记录不能是标头/页脚和主要固定长度记录。

问题单 1:简单固定长度记录

这个简单示例演示了如何设计模型来解析/格式化固定消息。

10A9PaulineMISINXD12345678BUYShare2500.45USD01-08-2009
Copy to Clipboard Toggle word wrap

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;
}
Copy to Clipboard Toggle word wrap

问题单 2:使用 alignment 和 padding 修复长度记录

此更详细的示例演示了如何定义字段的对齐以及如何分配 padding 字符,本例中为 '

10A9 PaulineM ISINXD12345678BUYShare2500.45USD01-08-2009
Copy to Clipboard Toggle word wrap

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;
}
Copy to Clipboard Toggle word wrap

case 3:字段填充

有时,为记录定义的默认 padding 不能应用于字段,因为我们有一个数字格式,其中我们希望使用 '0' 而不是 ' pad。在这种情况下,在模型中,您可以使用 @DataField 上的属性 paddingChar 设置此值。

10A9 PaulineM ISINXD12345678BUYShare000002500.45USD01-08-2009
Copy to Clipboard Toggle word wrap

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;
}
Copy to Clipboard Toggle word wrap

问题单 4:带有分隔符的固定长度记录

修复了长度记录有时会在记录内有分隔的内容。在以下示例中,firstName 和 lastName 字段使用以下示例中的 ^ 字符分隔:

10A9Pauline^M^ISINXD12345678BUYShare000002500.45USD01-08-2009
Copy to Clipboard Toggle word wrap

固定分隔

@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;
}
Copy to Clipboard Toggle word wrap

可以选择性地使用 ordinal 或 sequential 值(而不是精确列号)定义固定长度记录中的 pos 值。

case 5 :带有记录定义字段长度的固定长度记录

有时,固定长度记录可能会包含一个字段,用于定义同一记录中另一个字段的预期长度。在以下示例中,instrumentNumber 字段值的长度由记录中的 instrumentNumberLen 字段的值定义。

10A9Pauline^M^ISIN10XD12345678BUYShare000002500.45USD01-08-2009
Copy to Clipboard Toggle word wrap

固定分隔

@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;
}
Copy to Clipboard Toggle word wrap

case 6:带有标头和页脚的固定长度记录

bindy 将发现作为提供的模型的一部分配置的固定长度标头和页脚记录,只要注解的类与主 @FixedLengthRecord 类存在,或者在其中一个配置的扫描软件包中存在。以下文本说明了两个固定长度记录,它们被标头记录和页脚记录括起来。

101-08-2009
10A9 PaulineM ISINXD12345678BUYShare000002500.45USD01-08-2009
10A9 RichN ISINXD12345678BUYShare000002700.45USD01-08-2009
9000000002
Copy to Clipboard Toggle word wrap

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;
}
Copy to Clipboard Toggle word wrap

case 7 : 在解析固定长度记录时跳过内容。

通常与提供固定长度记录的系统集成,其包含比目标用例所需信息更多的系统。在这种情况下,跳过我们不需要的字段的声明和解析。要接受这一点,Bindy 将跳过记录中的下一个映射字段,如果下一个声明字段的 pos 值不在最后一个解析字段的光标位置。对感兴趣的字段使用绝对 pos 位置(而不是 ordinal 值)会导致 Bindy 在两个字段之间跳过内容。

同样,可能不关注某些字段之外的内容。在这种情况下,您可以通过设置 @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

}
Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat