getResponseAsStream - InputStream指向什么?

时间:2018-06-15 10:01:44

标签: java inputstream apache-httpclient-4.x

我很好奇HttpClient的getResponseAsStream实际上是如何工作的。

根据此article,您应该使用getResponseAsStream而不是将整个响应加载到内存中。

我的问题是这是如何工作的,InputStream指向哪里?

举一个例子,一个特定的REST服务请求返回一个生成的JSON 服务器存储在哪里,所以它可以流式传输到客户端?主内存是唯一的选择。

如果是这种情况,你就无法解决内存耗尽的问题。 这是如何运作的?

1 个答案:

答案 0 :(得分:1)

考虑以下非常简化的场景:

服务器生成大量数据,例如通过阅读大文件。它通过OutputStream将数据写入发送缓冲区。网络堆栈从发送缓冲区读取数据并将数据包发送到客户端。这里输入的数据被放入接收缓冲区。

最终接收缓冲区已满,客户端停止接受来自服务器的数据包。这会导致发送缓冲区填满。此时服务器暂停,因为它无法再将数据放入发送缓冲区。

客户端使用getResponseAsStream来获取从接收缓冲区读取数据的InputStream实现。一旦客户端通过InputStream读取数据,接收缓冲区就会清空,客户端的网络堆栈再次接受数据包,这会导致服务器端的发送缓冲区耗尽。现在服务器可以再次将数据写入缓冲区。

这样客户端可以读取任意数量的数据,系统永远不需要比发送和接收缓冲区更多的空间。

当然,这是非常简化的。有更多层,涉及更多缓冲区。但我希望这能解释基本原则。