我的输入文件有多种格式。我的第一行将被分隔,剩下的文件将是固定长度的。
如何编写映射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>
我不认为BeanIO涵盖了您的用例。我会尝试这样做:
- 请确保使用支持标记&重置。一个例子是标准
java.io.BufferedReader
- 首先在
BufferedReader
的输入上输入mark()
您当前的位置 - 读取所需的尽可能多的数据,以手动确定要使用2个BeanIO流中的哪一个来读取数据并将其转换为对象
- 现在
reset()
就是BufferedReader
,这将使它"返回"到与您调用mark()
相同的点 - 现在使用BeanIO读取您的数据
您可能需要重复上述过程或根据数据结构进行调整。您不会显示您的"标头"是单个记录,还是在"dec"记录之间可以多次出现。
如果你只有一个"头"记录,然后有多个"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
来使用"文件"流读取其余的输入数据。