克隆/多次从HttpResponse读取输入流

时间:2015-07-14 09:25:10

标签: java http inputstream httpresponse

我有一个包含一些数据的HttpResponse(json / xml,它可以包含大量数据)。 我正在使用一个函数来读取和使用带有此数据的输入流(它是关闭的,不能更改,也可能不接受字符串而不是输入流),以及验证数据的不同函数(一般验证,不相关)实际使用情况,这是我无法触及的部分。

我想做这样的事情:

HttpResponse response = getTheResponse();
InputStream in = response.getEntity().getContent(); 
boolean isVaid = validateData(in);
if(!isValid){
    throw new Exception("Something is wrong");
} else {
    useData(in);
}

由于validateData需要从InputStream读取数据(由我编写,因此可以操作),useData将获得一个空流。 实现这个的最佳方法是什么?我想过复制输入流,但是对于一个非常浪费的大响应。从InputStream转换为字符串可以产生相同的效果

有什么想法吗?

由于

1 个答案:

答案 0 :(得分:0)

基本上,你有两个选择

  1. 将结果保存在内存中
  2. 执行两次HTTP Get请求
  3. 执行两次HTTP请求将产生一些额外的网络流量,并要求端点是无效的。所以你移动额外的"加载"到网络和远程服务器。我不会这样做。

    保持结果可能是更好的方法,但可能需要一些内存,正如您所指出的那样。您可以将所有内容读入字节数组,并使用ByteArrayInputStream从该字节数组中读取。 如果改进了设计,可以使用固定缓冲区并对缓冲区的内容执行两种操作 - 如果部分内容可以接受的话。某些输入流具有倒带功能,最终归结为使用的内部缓冲区。但是,当从网络套接字读取时 - 这是读取http响应所必需的 - 由于套接字缓冲区可能已经被刷新,因此无法回退到流的开头。