字符串最大大小为722MB xml文件

时间:2014-07-08 12:26:56

标签: java xml

我有一个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

的标题

2 个答案:

答案 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);