当我们尝试使用BeanIO

时间:2018-11-09 13:42:26

标签: java bean-io

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

如何编写映射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>

1 个答案:

答案 0 :(得分:0)

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

  • 确保使用支持标记和重置功能的某些Reader实现。一个示例是标准java.io.BufferedReader
  • 首先mark()将您当前的位置放在BufferedReader的输入上。
  • 读取所需的大量数据,以手动识别2个BeanIO流中的哪一个用于读取数据并将其转换为对象。
  • 现在reset() BufferedReader,这将使其回到与您呼叫mark()的位置相同的位置。
  • 现在使用BeanIO读取数据。

您可能需要重复上述过程或对其进行调整,具体取决于数据的结构。您不会显示“标头”是单个记录还是在“十进制”记录之间可以多次出现。

如果您只有一个“标头”记录,然后有多个“ dec”记录,则可以使用以下方法简化上述过程:

  • 使用BufferedReader.readLine()方法将数据的第一行直接读取到String中。将此字符串传递给BeanIO阅读器以对其进行解析,并为您提供“标头”对象。

    String firstLine = bufferedReader.readLine(); BeanReader beanReader = null; FileSegment fileSegment = null; 尝试(Reader in = new BufferedReader(new StringReader(firstLine))){   beanReader = factory.createReader(“ ebcdicFile”,in);   fileSegment =(FileSegment)beanReader.read(); }

  • 现在,您可以创建另一个BeanReader,以使用“文件”流读取其余的输入数据。