EntityUtils.toString(entity)抛出OutOfMemory错误

时间:2014-03-19 15:15:30

标签: java http httpclient

我正在使用org.apache.http.HttpClient从URL获取响应,并使用EntityUtils.toString()将HttpEntity响应转换为字符串。

但是,当返回的数据很大时,有时会抛出OutOfMemory错误。这是有道理的,因为堆空间不能将整个响应字符串保存在内存中。

我的问题是如何将来自HttpClient的HttpEntity响应转换为字符串并降低这些OutOfMemoryErrors的机会(假设我不能增加堆大小)?

我更喜欢替代方式与EntityUtils.toString()一样高效或接近效率。

例外:

java.lang.OutOfMemoryError: Java heap space
at org.apache.http.util.CharArrayBuffer.<init>(CharArrayBuffer.java:59)
at org.apache.http.util.EntityUtils.toString(EntityUtils.java:230)
at org.apache.http.util.EntityUtils.toString(EntityUtils.java:273)

这是我的代码:

import org.apache.http.util.EntityUtils;
import org.apache.http.client.*;

url = "http://test.com/test"

HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(url);

HttpResponse response = client.execute(get);
HttpEntity entity = response.getEntity();
String result = EntityUtils.toString(entity);  //alternative???

1 个答案:

答案 0 :(得分:0)

HttpEntity有getContentLength()和getContent()等方法,这是一个输入流。

使用Streams会降低堆空间耗尽的可能性。

但是,如果格式不同,您必须让逻辑处理响应。这是一篇处理输入流的有用帖子:Reading a plain text file in Java