【发布时间】:2011-06-14 13:35:18
【问题描述】:
我有一个 Java 程序向我无法修改的 Web 服务发出请求。来自其中一个请求的响应可能非常大,如果我尝试将其解析为 Document 对象,堆内存就会耗尽。为了解决这个问题,我将响应逐块读取到 byte[] 缓冲区并将其写入磁盘。然后我计划逐行扫描文件并从我找到的每个元素中构建 Document 对象(这些是我需要的唯一响应元素):
StringBuilder sb = null;
String line = null;
while( (line = reader.readLine()) != null ){
if(line.trim().equals("<bond>")){
sb = new StringBuilder(line);
}
else if(line.trim().equals("</bond>")){
Document doc = builder.parse(sb.toString());
// Process doc
}
else{
sb.append(line);
}
}
不幸的是,换行符似乎在响应中转换为空格,所以一切都是一条巨大的线。我正在考虑的一种解决方案是使用 SAX 来处理解析,并以相同的方式构建我的文档片段。有没有人有其他解决方案或者这是我最好的选择?
谢谢, 贾里德
【问题讨论】:
-
Java xss 在大多数机器上通常为 3mb。要耗尽堆,您的响应应该大约大于 3mb,这在 imo 中是巨大的。但是,如果您的响应仅略大于 3mb,并且您有时会进入 java.lang.StackOverflowError,您可能希望将 xss 选项稍微增加,例如 4mb。例如,在我的 CentOS 上,我将它设置为 5mb,因为我用递归做了很多事情。但是,如果您决定坚持从 Document 对象中读取它,那么 SAX 解析器是实现 imo 的合理方式。请记住,就 CPU 周期而言,这将是双倍的工作。
标签: java xml web-services soap