【问题标题】:Cloning/Multiple reading an Input Stream from an HttpResponse从 HttpResponse 克隆/多次读取输入流
【发布时间】:2015-10-02 20:37:14
【问题描述】:

我有一个包含一些数据(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转换成字符串也可以达到同样的效果

有什么想法吗?

谢谢

【问题讨论】:

    标签: java http inputstream httpresponse


    【解决方案1】:

    基本上,您有两个选择

    1. 将结果保存在内存中
    2. 执行两次 HTTP Get 请求

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

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

    【讨论】:

    • 如何将 InputStream 转换为字符串,然后将字符串用于两个函数 - 这听起来像是一个可以接受的解决方案吗?
    • 字节数组是首选,因为输入流总是返回字节数据。如果你有阅读器,字符串可能是一个很好的解决方案
    猜你喜欢
    • 2014-08-19
    • 2012-03-19
    • 2020-06-08
    • 2019-07-15
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多