我正在使用 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/