我很好奇HttpClient的getResponseAsStream实际上是如何工作的。
根据此article,您应该使用getResponseAsStream
而不是将整个响应加载到内存中。
我的问题是这是如何工作的,InputStream指向哪里?
举一个例子,一个特定的REST服务请求返回一个生成的JSON 服务器存储在哪里,所以它可以流式传输到客户端?主内存是唯一的选择。
如果是这种情况,你就无法解决内存耗尽的问题。 这是如何运作的?
答案 0 :(得分:1)
考虑以下非常简化的场景:
服务器生成大量数据,例如通过阅读大文件。它通过OutputStream将数据写入发送缓冲区。网络堆栈从发送缓冲区读取数据并将数据包发送到客户端。这里输入的数据被放入接收缓冲区。
最终接收缓冲区已满,客户端停止接受来自服务器的数据包。这会导致发送缓冲区填满。此时服务器暂停,因为它无法再将数据放入发送缓冲区。
客户端使用getResponseAsStream
来获取从接收缓冲区读取数据的InputStream实现。一旦客户端通过InputStream读取数据,接收缓冲区就会清空,客户端的网络堆栈再次接受数据包,这会导致服务器端的发送缓冲区耗尽。现在服务器可以再次将数据写入缓冲区。
这样客户端可以读取任意数量的数据,系统永远不需要比发送和接收缓冲区更多的空间。
当然,这是非常简化的。有更多层,涉及更多缓冲区。但我希望这能解释基本原则。