我正在使用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???
答案 0 :(得分:0)
HttpEntity有getContentLength()和getContent()等方法,这是一个输入流。
使用Streams会降低堆空间耗尽的可能性。
但是,如果格式不同,您必须让逻辑处理响应。这是一篇处理输入流的有用帖子:Reading a plain text file in Java