【问题标题】:Best way to convert an InputStream object to String将 InputStream 对象转换为字符串的最佳方法
【发布时间】:2014-09-12 10:41:24
【问题描述】:

我有一个InputStream 对象,其中包含XML 格式的数百万个文件信息(名称、创建日期、作者等)。我已经尝试使用IOUtils.copy 方法将其转换为String,但由于该信息的大小非常大,运行几分钟后会抛出java.lang.OutOfMemoryError

增加JVM 内存不是一种选择,因为我从中收集信息的文件数量会永远增加。那么有人可以建议我应该怎么做才能解决这个问题吗?

【问题讨论】:

  • InputStream的具体实现是什么?例如是ByteArrayInputStream
  • 如果输入太大,您的其他选择是 (a) 首先尝试将其 ETL 到数据库中或 (b) 使用 Hadoop 或类似的东西
  • 将大量数据转换为一个字符串似乎是错误的方法。你想对字符串做什么?
  • 如果您无法将对象放入内存中,请避免需要将其存储在内存中的情况。将其作为流使用。
  • 如果数据太大而无法存储在内存中并且您无法增加内存,那么您的选择就会受到限制 - 要么作为流处理,提取您需要的内容,要么将数据保存在某处以供以后访问.

标签: java string inputstream


【解决方案1】:

您遇到的问题是存在基于流的 IO 的非常原因,在使用之前将大量数据吸入内存是不可行的。

将您的流解析为...流!有关使用 SAX 进行基于流的 XML 解析的更多信息,请参阅Oracle tutorials

XMLReader xmlreader =
    SAXParserFactory.newInstance().newSAXParser().getXMLReader();
xmlreader.setContentHandler(new ContentHandler() {
    ...
});

xmlreader.parse(new InputSource(myInputStream));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-01
    • 2021-08-03
    • 2014-06-21
    • 2010-10-10
    • 2013-09-20
    • 2011-03-29
    • 1970-01-01
    相关资源
    最近更新 更多