Java 在ApacheHttpClient 4.x中多次读取响应体

Java 在ApacheHttpClient 4.x中多次读取响应体,java,inputstream,apache-httpclient-4.x,Java,Inputstream,Apache Httpclient 4.x,我正在应用程序中使用ApacheHttpClient 4.2.3。我们存储HTTP调用的响应,如下所示: HttpResponse httpResponse = (DefaultHttpClient)httpClient.execute(httpRequest); 响应主体是4.x API中的InputStream: InputStream responseStream = httpResponse.getEntity().getContent(); 我的问题是,我需要在应用程序中的各个点将

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

HttpResponse httpResponse = (DefaultHttpClient)httpClient.execute(httpRequest);
响应主体是4.x API中的InputStream:

InputStream responseStream = httpResponse.getEntity().getContent();
我的问题是,我需要在应用程序中的各个点将响应体作为字符串和字节[]读取。但是Apache使用的InputStream是一个EofSensorInputStream,这意味着一旦我到达流EOF,它就会关闭。我是否可以多次获取字符串和字节[]表示,而不关闭流

我已经尝试过将其设置为请求主体,但由于我的响应主体可以达到几个gig,所以它不起作用。我也尝试过,但我注意到原始响应流仍然关闭

欢迎任何指点


编辑:在一个相关的注释中,如果我能够找到输入流的长度,或者不使用流,或者通过反转使用,那将是非常棒的。

1。我认为您的要求有些冲突:

(a)

这不起作用,因为我的反应身体可以达到几次演出

(b)

我是否可以多次获取字符串和字节[]表示,而不关闭流

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

顺便说一句,以字节形式获取响应的另一种方法是
EntityUtils.byte[]toByteArray(最终的HttpEntity实体)

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

二,

如果我能找到输入流的长度,那也太好了

httpResponse.getEntity().getContentLength()


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

IOUtils或EntityUtils将为您提供字节[],因为它们读取整个流,所以在这种情况下,流将关闭(EofSensorInputStream)。这意味着我不能在响应流上再次调用getAsByteArray(InputStream)。另外,关于内存问题,我可能可以在内存中使用一次大字节[],但不能超过这个数目。@Karthik.V一旦从EntityUtils.toByteArray()中获得字节[],您就可以获得所需的数据的单个副本。您还可以将其包装到ByteArrayInputStream中,它不应该导致OutOfMemoryError,因为ByteArrayInputStream不复制字节[]。顺便说一句,您不应该将响应保留这么长时间,请记住这是来自远程服务器的响应。你打算怎么重读?这会导致服务器再次向您发送N-gigs吗?关于如何多次重读大型响应,请参见答案中的第3项。