【问题标题】:EntityUtils.toString(entity) throwing OutOfMemory errorsEntityUtils.toString(entity) 抛出 OutOfMemory 错误
【发布时间】: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


【解决方案1】:

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

使用 Streams 将减少堆空间耗尽的可能性。

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

【讨论】:

    猜你喜欢
    • 2015-04-07
    • 2012-01-14
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2012-08-21
    • 2015-12-04
    • 1970-01-01
    相关资源
    最近更新 更多