我有一个存储在数据库blob中的xml文件,用户可以通过spring / hibernate Web应用程序下载该文件。在通过Hibernate将其作为byte []检索之后,在将其发送到输出流之前,我需要编辑XML的某些部分(具有两个子节点和属性的单个节点)。
我担心的是如果文件较大(有些是40mb +)那么我真的不想通过将整个文件放在内存中,编辑它然后通过输出流将它传递给用户来实现这一点。有没有办法在飞行中编辑它?
byte[] b = blobRepository.get(blobID).getFile();
// What can I do here?
ServletOutputStream out = response.getOutputStream();
out.write(b);
答案 0 :(得分:2)
您可以使用SAX流。
使用SAX框架解析文件,并且当Handler收到SAX事件时,将未更改的项目传递回构建XML输出的SAX Handler。
当您到达“要更改的部分”时,您的中间课程将读取不需要的事件,并写出想要的事件。
这样做的好处是不会将整个文件作为中间表示(比如DOM)保存在内存中;但是,如果转换很复杂,则可能必须缓存许多项(文档的各个部分),以使它们可用于重新排列的输出。一个足够复杂的转换(可以做任何事情的转换)最终变成了DOM的开销,但是如果你知道你忽略了大部分文档,那么你可以节省大量的内存。
答案 1 :(得分:2)
您可以尝试以下操作: