BeanIO - 如何检测具有相同类型的多个记录

问题描述

如何检测定长文件中相同的记录类型? BeanIO 只检测到第一个记录头,没有其他两个文件。 我想要的是获取带有三个文档及其项目代码的包装类。

这是一个固定长度的txt文件示例:

PHP.ini

我想检测标题 (RH) 和详细信息 (RD) 记录。

我为每个子组设计了一个组列表,其中包含另一个组。

顶级班级:

UnkNown record
UnkNown record
RH20210607A
RDitem1
RDitem2
UnkNown record
RH20210607B
RDitem2
RDitem3
UnkNown record
UnkNown record
UnkNown record
RH20210607C
RDitem1
RDitem4
RDitem5

子组类:

@Group(name = "fixedFile")
public class ListDocumentWrapper {

    @Group(minOccurs=1,type=Document.class,collection = List.class)
    List<Document> documentList;
}

单记录类:

@Data
public class Document{

    @Record(order = 1,minOccurs=1,maxOccurs=1)
    private RH recordHeader;
    @Record(order = 2,type=RD.class,collection = List.class)
    private List<RD> recordDetails;
}
@Data
@Record
public class RH{

    @Field(ordinal = 0,required = true,length = 2,align = Align.LEFT,rid = true,literal = "RH")
    private String recordtype;

    @Field(ordinal = 1,length=8,format = "yyyyMMdd")
    private LocalDate documentDate;

    @Field(ordinal = 2,length = 1,padding = ' ',align = Align.LEFT)
    private String documentCode;
}

BeanReader 的初始化:

@Data
@Record
public class RD{

    @Field(ordinal = 0,literal = "RD")
    private String recordtype;

    @Field(ordinal = 1,length = 5,align = Align.LEFT)
    private String itemCode;
}

感谢帮助

解决方法

我没有找到正确的解决方案,但我找到了解决方法。

想要进行一次阅读并获得文档列表

这是解决方法。

首先我不明白 beanReader.read() 提取流的第一个元素。所以没有必要创建ListDocumentWrapper,而是用一个简单的while循环读取所有文档

这是代码的摘录:

List<Document> documentList = new ArrayList<>();
Document documentMessage = null;
int documentIndex = 0;
        while ((documentMessage = (Document) beanReader.read()) != null) {
            // process the documentMessage...
            log.debug("Reading documentMessage ["+documentIndex+"]... => " + documentMessage);

            documentList.add(documentMessage);
            documentIndex++;
        }