java - EntityUtils.toString(entity) 抛出 OutOfMemory 错误

标签 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???

最佳答案

HttpEntity 有像 getContentLength() 和 getContent() 这样的方法,它是一个输入流。

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

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

关于java - EntityUtils.toString(entity) 抛出 OutOfMemory 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22510286/

相关文章:

java - CORS 预检请求在选项请求方法之后未进行调用

java - 如何使用 Jira Rest Java 客户端更新 Jira 问题解决方案

java - HttpClient:如何从现有连接获取底层套接字?

java - 在同一 block 中调用方法两次。为什么?

java - 在 Java Swing 中,如何将数组中的数据从一个表单传递到下一个表单?

http - 如何从运行 ssl 的网站向外部 webapi 发出非 ssl 请求

http - 如何在go fasthttp中添加自定义http header ?

http - 浏览器的永久 HTTP 重定向

java - DefaultHttpClient 引发由 : java. lang.ClassNotFoundException : org. slf4j.LoggerFactory 引起

flutter - (Flutter) HTTPClient 无效参数 : No host specified in URI