【发布时间】:2014-03-19 15:15:29
【问题描述】:
我正在使用 org.apache.http.HttpClient 从 URL 获取响应,并使用 EntityUtils.toString() 将 HttpEntity 响应转换为字符串。
但是,当返回的数据很大时,有时会引发 OutOfMemory 错误。这是有道理的,因为堆空间不能将整个响应字符串保存在内存中。
我的问题是如何将 HttpEntity 响应从 HttpClient 转换为字符串并减少这些 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???
【问题讨论】:
-
不要转换为
String将是恕我直言的逻辑结论。你需要对结果做什么? -
@M.Deinum 不幸的是,这是一个将字符串返回给客户端的 API。所以我无法更改返回格式。
-
你打算用
String做什么?大概将其打印到某个地方(控制台?文件?记录器?)。在所有这些情况下,您都可以流式传输内容,而不是将全部内容读入内存。 -
字符串响应到底有多大?
-
将其直接流式传输到客户端而不是字符串。使用
entity.writeTo而不是将其转换为字符串。
标签: java http httpclient