从OMElement获取InputStream

时间:2014-05-09 09:23:50

标签: java axiom

我试过以下样本[1];但由于我的OMElement太大,(我正在转换文件,(800MB)为OMelement,它来自另一个进程)我面临以下问题,

  • 流程耗尽内存
  • 序列化需要很长时间。

有人能指出我正确的解决方案吗?

[1]

 BufferedReader in = null;
 ByteArrayOutputStream baos = null;
 InputStream is = null;
 try {

    baos = new ByteArrayOutputStream();
    fileContent.serialize(baos);

    is = new ByteArrayInputStream(baos.toByteArray());

    in = new BufferedReader(new InputStreamReader(is));

1 个答案:

答案 0 :(得分:1)

很遗憾,您的问题并没有明确说明您要解决的实际问题。相反,它描述了您认为可以解决问题的问题。因此,我只能根据您对Ian Roberts的回应来尝试重建问题。

如果我对这些评论的解释是正确的,那么问题如下。您有一个XML文档,其中包含一个具有长字符序列的元素,该元素被分为多行:

<some_element>
line 1
line 2
line 3
...
line N
</some_element>

您希望逐行处理元素的内容,但N很大,因此您需要找到一种内存有效的方法,即避免将整个内容加载到内存中的方法。

您提供的代码段显示您在尝试解决该问题时采取了错误的指示。代码序列化OMElement代表some_element,然后从序列化输出中创建InputStream / Reader。但是,这也包含some_element的开始和结束标记,这不是您想要的。相反,您只对元素的内容感兴趣。如果查看OMElement接口,可以看到它实际上定义了一个将该内容作为Reader返回的方法。它被称为getTextAsStream,而Javadoc解释了如何以内存使用量为O(1)而不是O(N)的方式使用该方法。