使用缓冲 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.jar
和 stax2-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 一个字符串,所以我不知道为什么这个更改可以解决问题,但确实如此。
背景
我正在编写一个 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.jar
和 stax2-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 一个字符串,所以我不知道为什么这个更改可以解决问题,但确实如此。