我有一个ByteArrayOutputStream
,它包含一个750MB大小的XML字节表示。
我需要将其转换为String。
我写道:
ByteArrayOutputStream xmlArchive = ...
String xmlAsString = xmlArchive.toString(UTF8);
然而,虽然我使用4GB的堆大小,但我得到了java.lang.OutOfMemoryError:Java堆空间
有什么问题?我怎么知道要使用哪个堆大小?我正在使用JDK64位
更新
我需要它作为字符串才能删除"<?xml"
目前我的代码是:
String xmlAsString = xmlArchive.toString(UTF8);
int xmlBegin = xmlAsString.indexOf("<?xml");
if (xmlBegin >0){
return xmlAsString.substring(xmlBegin);
}
return xmlAsString;
然后我再将它转换为字节数组。
更新2 ByteArrayOutputStream是这样写的:
HttpMethod method ..
InputStream response = method.getResponseBodyAsStream();
byte[] buf = new byte[5000];
while ( (len=response.read(buf)) != -1) {
output.write(buf, 0, len);
}
len
来自回复Content-Length
答案 0 :(得分:2)
您可以使用Scanner
类:
Scanner scanner = new Scanner(response, StandardCharsets.UTF_8.name());
// skip to "<?xml"
scanner.skip(".*?(?=<\\?xml)");
// process rest of stream
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
// Do something with line
}
scanner.close();
答案 1 :(得分:1)
扩展Jamie Cockburn的回答:
填写他的while循环以符合您的预期行为:
byte[] buf = line.getBytes(StandardCharsets.UTF_8.name());
output.write(buf, 0, buf.length);