その場で XSD を使用して最終結果を検証しながら、いくつかの CSV ファイル (それぞれが 600 MB を超える) を XML に変換する必要があります。
各ファイルのサイズのため、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: コードは REST Web サービスとして実行されるため、OutputStream の正確な実装を制御することはできません。
return Response.ok(new StreamingOutput() {
@Override
public void write(OutputStream output) throws Exception {
.... loading and transforming csv ...
}
}).build();