我必须将一些 CSV 文件(每个 > 600 MB)转换为 XML,同时使用 XSD 动态验证最终结果。
由于每个文件的大小,我使用 InputStreams 读取内容并使用 OutpuStreams 将结果作为 XML 流式传输回我的客户端。
让我们从简单的部分开始......(伪代码)
void transform(final InputStream CSVCustomerStream, final OutputStream outputStream) {
outputStream.write("<customers>")
foreach csvCustomerRow in CSVCustomerStream {
String xmlCustomerRow = csvCustomerRow.toXML();
outputStream.write(xmlCustomerRow.getBytes();
}
outputStream.write("</customers>")
**MISSING_XMLVALIDATOR.parse(outputStream);**
}
到目前为止,我的源 CSV 文件的每一行都转换为 xml,然后写入输出流。
很容易。
但是,实际上验证 xml 的部分仍然缺失。
为此,我研究了XMLReader的 parse() 方法。唯一的问题是 parse() 仅接受 InputSources,而同时我将要验证的内容流式传输到 OutputStream。
当然,在阅读了整个 CSV 内容之后,我可以通过以下方式将 OutputStream 转换为 InputStream
new ByteArrayInputStream((outputstream).toByteArray())
但这会立即将价值 600 MB 的 XML 带回内存,违背了流式传输的全部目的。
PS:我无法控制 OutputStream 的确切实现,因为我的代码作为 REST-webservice 运行
return Response.ok(new StreamingOutput() {
@Override
public void write(OutputStream output) throws Exception {
.... loading and transforming csv ...
}
}).build();