2013-04-25 103 views
2

我在我的应用程序中使用了Apache HttpClient 4.2.3。我们店的HTTP调用的,像这样的回应:在Apache HttpClient 4.x中多次读取响应正文

HttpResponse httpResponse = (DefaultHttpClient)httpClient.execute(httpRequest); 

回应主体4.x的API中的InputStream:

InputStream responseStream = httpResponse.getEntity().getContent(); 

我的问题是我需要读取响应主体作为字符串和字节[]在应用程序的各个点。但是Apache使用的InputStream是一个EofSensorInputStream,这意味着一旦我到达流EOF,它就会关闭。无论如何,我可以多次获取字符串和字节[]表示并且不关闭流?

我已经试过wrapping the byte array in a new ByteArrayInputStream并将其设置为请求正文,但它不起作用,因为我的响应正文可以达到几个演出。我也尝试过this,但我注意到原始响应流仍然关闭。

任何指针都会受到欢迎。

编辑:在一个相关的说明,如果我可以找到InputStream的长度,而不消耗流或扭转消耗也将是伟大的。

回答

2

1。我觉得你有几分冲突的要求:

一)

这是行不通的,因为我的身体的反应可以达到几演出

B)

有无论如何,我可以多次获得字符串和字节[]表示并且不关闭流

如果你没有足够的内存,这是不可能的。

顺便说一句,另一种获得字节响应的方法是EntityUtils.byte[] toByteArray(final HttpEntity entity)

你真的需要N-gigs字符串吗?你打算怎么处理它?

2。

将它也是巨大的,如果我能找到的InputStream

httpResponse.getEntity().getContentLength()

3的长度。由于响应不适合内存,我建议将其保存到文件(或临时文件)中。然后在该文件上设置InputStream,然后根据需要多次读取它。

+1

IOUtils或EntityUtils会为您提供byte [],因为他们读取整个流,所以在这种情况下流会关闭(EofSensorInputStream)。这意味着我无法再对响应流调用getAsByteArray(InputStream)。另外,关于内存问题,我可能在内存中承担一个大字节[],但不会超过这个。 – 2013-04-26 05:03:05

+0

@ Karthik.V一旦你从EntityUtils获得字节[]。toByteArray(),你会得到你想要的单个数据副本。您也可以将其包装到ByteArrayInputStream中,并且它不应该导致OutOfMemoryError,因为ByteArrayInputStream不会复制byte []。顺便说一句,你不应该保持这么长时间的回应,请记住这是来自远程服务器的响应。你将如何重读它?那会导致服务器再次向你发送N-gigs?有关如何重读大量回复多次的答案,请参阅我的第3项。 – Vitaly 2013-04-26 06:15:10