使用缓冲 Reader 读取文件

Reading through a File with a Buffered Reader

背景

我正在编写一个 xml 转换器,它从文本文件中获取输入并将它们转换为 xml。在文本文件中,每条记录由一行表示,每个字段由它们之间的制表符表示。所以在文本文件中两条记录看起来像:

fieldA     fieldB     fieldC
fieldA     fieldB     fieldC

问题

我正在将文本文件加载到 bufferedReader 中并使用 StAX 实现 WoodStox 创建 XML。我可以看到我正在从我的 getColumnValue 方法中获取正确的记录数据。但出于某种原因,WoodStox 一遍又一遍地写入第一条记录,而不是通过 while 循环获取每次传递的数据。因为我知道输入(来自 getColumnValue)是正确的,所以我只能得出结论,问题出在伍德斯托克,但到目前为止我还无法理解为什么......

代码:

while ((strRead = buffer.readLine()) != null) {

    String recordInputs[] = strRead.split("\t");
    writer.writeStartElement("Record");

    writer.writeStartElement("FIELDA");
    writer.writeCharacters(getColumnValue("BSTYPE", tableColumns, recordInputs));
    writer.writeEndElement();

    writer.writeStartElement("FIELDB");
    writer.writeCharacters(getColumnValue("BSDDT", tableColumns, recordInputs));
    writer.writeEndElement();

    writer.writeStartElement("FIELDC");
    writer.writeCharacters(getColumnValue("BSACTIVE", tableColumns, recordInputs));
    writer.writeEndElement();

    writer.writeEndElement();
}

writer.writeEndElement();
writer.writeEndDocument();

writer.flush();
writer.close();

由于您没有提供 Minimal, Complete, and Verifiable example,这里是:

String input = "1\t2\t3\r\n" +
               "4\t5\t6\r\n";
XMLStreamWriter writer = XMLOutputFactory.newFactory().createXMLStreamWriter(System.out);
System.out.println(writer.getClass());
writer.writeStartDocument();
writer.writeStartElement("Root");
try (BufferedReader in = new BufferedReader(new StringReader(input))) {
    for (String strRead; (strRead = in.readLine()) != null; ) {
        String recordInputs[] = strRead.split("\t");
        writer.writeStartElement("Record");

        writer.writeStartElement("FIELDA");
        writer.writeCharacters(recordInputs[0]);
        writer.writeEndElement();

        writer.writeStartElement("FIELDB");
        writer.writeCharacters(recordInputs[1]);
        writer.writeEndElement();

        writer.writeStartElement("FIELDC");
        writer.writeCharacters(recordInputs[2]);
        writer.writeEndElement();

        writer.writeEndElement();
    }
}
writer.writeEndElement();
writer.writeEndDocument();
writer.flush(); // Don't close System.out

当 运行 在 Java 8 没有 Woodstox 时,我得到(为便于阅读而格式化):

class com.sun.xml.internal.stream.writers.XMLStreamWriterImpl

<?xml version="1.0" ?>
<Root>
    <Record><FIELDA>1</FIELDA><FIELDB>2</FIELDB><FIELDC>3</FIELDC></Record>
    <Record><FIELDA>4</FIELDA><FIELDB>5</FIELDB><FIELDC>6</FIELDC></Record>
</Root>

如您所见,它使用内置的 Java 实现,并且值很好。

当 运行 与 woodstox-core-asl-4.2.0.jarstax2-api-3.1.1.jar 在类路径上时,我得到(为便于阅读而格式化):

class com.ctc.wstx.sw.SimpleNsStreamWriter

<?xml version='1.0' encoding='UTF-8'?>
<Root>
    <Record><FIELDA>1</FIELDA><FIELDB>2</FIELDB><FIELDC>3</FIELDC></Record>
    <Record><FIELDA>4</FIELDA><FIELDB>5</FIELDB><FIELDC>6</FIELDC></Record>
</Root>

如您所见,它使用的是 Woodstox 实现,并且值仍然不错。

由于您没有包含 getColumnValue() 的逻辑,也没有提供可验证的示例,或者您使用的 Woodstox 版本,因此我们无能为力。

我从来没有找到一个很好的答案来解释为什么这不起作用,但我确实设法修复了它。

不工作:

writer.writeCharacters(getColumnValue("BSTYPE", tableColumns, customer));

工作:

String bsType = getColumnValue("BSTYPE", tableColumns, customer);
writer.writeCharacters(csType);

就像我之前所说的 getColumnValue() returns 一个字符串,所以我不知道为什么这个更改可以解决问题,但确实如此。