在Apache HttpClient 4.x中多次从响应主体读取

时间:2013-04-25 11:45:23

标签: java inputstream apache-httpclient-4.x

我在我的应用程序中使用Apache HttpClient 4.2.3。我们存储HTTP调用的响应,如下所示:

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

响应正文是4.x API中的InputStream:

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

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

我已经尝试wrapping the byte array in a new ByteArrayInputStream并将其设置为请求正文,但由于我的回复正文可以达到一些演出,因此无效。我也尝试了this,但我注意到原来的响应流仍然关闭了。

欢迎任何指示。

编辑:在相关的说明中,如果我能够在不消耗流量或通过逆转消耗的情况下找到InputStream的长度,那也是很好的。

1 个答案:

答案 0 :(得分:2)

1。我认为你的要求有些矛盾:

A)

  

它不起作用,因为我的回复机构可以达到一些演出

b)中

  

无论如何,我可以多次获取字符串和byte []表示而不关闭流

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

顺便说一下,另一种以字节为单位获取响应的方法是EntityUtils.byte[] toByteArray(final HttpEntity entity)

你真的需要N-Gigs String吗?你打算用它做什么?

2。

  如果我能找到InputStream的长度

,那也很棒

httpResponse.getEntity().getContentLength()

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