我有一个存储在数据库 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);
您可以使用 SAX 流。
使用 SAX 框架解析文件,当您的处理程序接收 SAX 事件时,将未更改的项目传回构造 XML 输出的 SAX 处理程序。
当您到达“要更改的部分”时,您的中间类将读入不需要的事件,并写出想要的事件。
这样做的优点是不需要将整个文件作为中间表示(例如 DOM)保存在内存中;但是,如果转换很复杂,您可能必须缓存许多项目(文档的部分),以便将它们用于重新排列的输出。足够复杂的转换(可以做任何事情的转换)最终会变成 DOM 的开销,但如果您知道自己忽略了文档的很大一部分,则可以节省大量内存。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)