2014-03-19 64 views
2

我使用org.apache.http.HttpClient从URL获取响应,并使用EntityUtils.toString()将HttpEntity响应转换为字符串。EntityUtils.toString(实体)抛出OutOfMemory错误

但是,当返回的数据很大时,有时会引发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

不要转换为'字符串'将是逻辑结论imho。你需要怎样处理结果? –

+0

@ M.Deinum不幸的是,这是一个将字符串返回给客户端的API。所以我不能改变返回格式。 –

+3

你打算用'String'做什么?大概是打印到某个地方(控制台?文件?记录器?)。在所有这些情况下,您可以流式传输内容,而不是将整个内容读入内存。 –

回答

0

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

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

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