Java 将InputStream对象转换为字符串的最佳方法

Java 将InputStream对象转换为字符串的最佳方法,java,string,inputstream,Java,String,Inputstream,我有一个InputStream对象,它以XML格式包含数百万个文件信息(名称、创建日期、作者等)。我已经尝试使用IOUtils.copy方法将其转换为String,但由于该信息的大小相当大,因此在运行几分钟后会抛出java.lang.OutOfMemoryError 增加JVM内存不是一个选项,因为我从中收集信息的文件数量永远在增加。那么,有人能建议我应该怎么做来解决这个问题吗?您遇到的问题就是基于流的IO存在的原因,在使用它之前将大量数据读入内存是不可行的 将您的流解析为。。。一条小溪!有关使

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


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

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

将您的流解析为。。。一条小溪!有关使用SAX进行基于流的XML解析的更多信息,请参阅

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

xmlreader.parse(new InputSource(myInputStream));

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