3

ユーザーがSpring/HibernateWebアプリケーションを介してダウンロードするデータベースBLOBに保存されたxmlファイルがあります。Hibernateを介してbyte[]として取得された後、出力ストリームに送信される前に、XMLの一部(2つの子ノードと1つの属性を持つ単一ノード)を編集する必要があります。

私の懸念は、ファイルが大きい場合(40mb以上のものもあります)、ファイル全体をメモリに保存し、編集して、出力ストリームを介してユーザーに渡すことによって、これを実行したくないということです。'オンザフライ'で編集する方法はありますか?

byte[] b = blobRepository.get(blobID).getFile();
// What can I do here?
ServletOutputStream out = response.getOutputStream();
out.write(b);
4

2 に答える 2

2

SAX ストリームを使用できます。

SAX フレームワークを使用してファイルを解析し、ハンドラーが SAX イベントを受け取ると、変更されていないアイテムを SAX ハンドラーに戻し、XML 出力を構築します。

「変更する部分」に到達すると、中間クラスは不要なイベントを読み取り、必要なイベントを書き出します。

これには、ファイル全体を中間表現 (DOM など) としてメモリに保持しないという利点があります。ただし、変換が複雑な場合は、多数のアイテム (ドキュメントのセクション) をキャッシュして、再配置された出力に使用できるようにする必要がある場合があります。十分に複雑な変換 (何でもできる変換) は、最終的に DOM のオーバーヘッドになりますが、ドキュメントの大部分を無視していることがわかれば、多くのメモリを節約できます。

于 2012-07-26T15:24:12.577 に答える