0

我的输入文件有多种格式。我的第一行将被分隔,其余文件将是固定长度。

如何编写我的映射 xml 文件并从 java 中读取它?

我尝试编写多个流,但没有奏效。

我的 mapping.xml 是这样的,

<beanio xmlns="http://www.beanio.org/2012/03"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.beanio.org/2012/03 http://www.beanio.org/2012/03/mapping.xsd">
    <stream name="ebcdicFile" format="delimited">
        <parser>
            <property name="delimiter" value="|" />
        </parser>
        <record name="header"
            class="sft_action_cms_apt_394.sft_action_cms_apt_394.FileSegment">
            <field name="fileName" />
            <field name="batchCount" />
            <field name="totalRecords" />
            <field name="maxBatchSize" />
            <field name="pickUpTime" />
            <field name="errorFlag" />
        </record>
    </stream>
    <stream name="file" format="fixedlength">
        <record name="dec"
            class="sft_action_cms_apt_394.sft_action_cms_apt_394.pojo">
            <field name="tag" length="4" />
            <field name="description" length="unbounded" />
        </record>
    </stream>
</beanio>
4

1 回答 1

1

我不认为 BeanIO 涵盖了您的用例。我会尝试做这样的事情:

  • 确保使用一些支持标记和重置的 Reader 实现。一个例子是标准java.io.BufferedReader
  • 首先mark()是您在 . 输入上的当前位置BufferedReader
  • 读取您需要的尽可能多的数据,以手动识别您的 2 个 BeanIO 流中的哪一个用于读取数据并将其转换为您的对象。
  • 现在reset()BufferedReader这将使它“返回”到与您调用 的位置相同的位置mark()
  • 现在使用 BeanIO 读取您的数据。

您可能需要重复上述过程或根据数据结构对其进行调整。您不会显示您的“标题”是否是单个记录,或者它是否可以在“dec”记录之间出现多次。

如果您只有一个“header”记录,然后有多个“dec”记录,则可以通过以下方式简化上述过程:

  • BufferedReader.readLine()使用方法直接将数据的第一行读入String. 将此字符串传递给 BeanIO 阅读器以解析它并返回“标题”对象。

    String firstLine = bufferedReader.readLine();
    BeanReader beanReader = null;
    FileSegment fileSegment = null;
    try (Reader in = new BufferedReader(new StringReader(firstLine))) {
      beanReader = factory.createReader("ebcdicFile", in);
      fileSegment = (FileSegment)beanReader.read();
    }
    
  • 现在您可以创建另一个BeanReader来使用“文件”流读取其余的输入数据。

于 2018-11-11T22:48:27.540 回答