java - 从 HttpResponse 克隆/多重读取输入流

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

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

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

关于java - 从 HttpResponse 克隆/多重读取输入流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31402711/

相关文章:

java - 当我们传递一个空字符串时,String 的 valueOf 方法返回 4

无法通过socket HTTP请求获取图片数据

java - System.in 和自定义 InputStreamReader 之间的行为差​​异

Java Socket InputStream read() 总是在结束之前返回 -1

java - 如何在最短时间内用 Java 克隆输入流

java - java中如何从矩阵中返回一个值

java - 是否可以使用一个对象在 JTable 字段中显示不同的数据?

java - 迭代映射时出现 ConcurrentModificationException

http - If-Modified-Since 在浏览器中覆盖 If-None-Match

c# - HTTP 连接问题