繁体   English   中英

克隆/多次读取HttpResponse中的输入流

[英]Cloning/Multiple reading an Input Stream from an HttpResponse

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

我想做这样的事情:

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. 将结果保存在内存中
  2. 两次执行HTTP Get请求

两次执行HTTP请求将产生一些额外的网络流量,并且要求端点是独立的。 因此,您将其他“负载”移至网络和远程服务器。 我不会那样做。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM