【问题标题】:Getting InputStream from OMElement从 OMElement 获取 InputStream
【发布时间】:2014-05-11 05:32:05
【问题描述】:

我尝试了以下示例 [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));

【问题讨论】:

  • 为什么需要输入流?您要将它传递给哪些其他代码?它必须是输入流还是你可以使用其他技术,例如如果您的目标 API 可以充当 SAX 内容处理程序,那么您可以直接从 OM 树转到该处理程序,而无需在途中通过纯 XML。
  • 我再次需要从自定义类中的 Inputstream 读取内容。 'fileContent' 具有 OMElement。我们可以使用其他技术,但我需要阅读内容。我的 OMElement 包含一个大文件内容,(带有一系列文本/字符)我逐行读取并在我的自定义类中进行处理
  • "逐行"在处理 XML 时有点危险,因为它表明您正在尝试将 XML 视为纯文本,尤其是在此例如,单参数InputStreamReader 构造函数将忽略编码声明,并始终将流视为当前平台的默认编码。如果这是一个自定义类,那么为什么不能直接将 OMElement 传递给它,让它遍历已经解析的 XML 树本身呢?
  • 我在做字符串操作,不确定我能不能直接用 OMelement..while (in.ready()) { StringBuffer output = new StringBuffer();字符串行 = in.readLine(); if (row.length() == 902) { append(output, row.substring(0, 4), false);追加(输出,row.substring(4, 64),假);追加(输出,row.substring(64, 73),假);

标签: java axiom


【解决方案1】:

很遗憾,您的问题没有清楚地描述您要解决的实际问题。相反,它描述了您认为可以解决问题的问题。因此,我只能尝试根据您为响应 Ian Roberts 所做的 cmet 来重构问题。

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

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

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

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

【讨论】:

  • 对不起,如果我的问题不清楚。你的理解是对的。我有一个包含很多行的大文本文件。 (文件大小为1GB)当它通过系统(apache synapse)时,它进入soapbody。我想逐行阅读它以处理我的自定义 java 类中的文件。我也内存不足问题和序列化问题。我在这里引用了您的旧帖子 [1] 并认为没有图书馆。谢谢你的回答我会试试[1]stackoverflow.com/questions/8221892/…
猜你喜欢
  • 2012-01-03
  • 1970-01-01
  • 2017-07-24
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
  • 2014-04-08
  • 2012-02-04
  • 2021-03-06
相关资源
最近更新 更多