代码之家  ›  专栏  ›  技术社区  ›  ng.newbie

getresponseastream-inputstream指向什么?

  •  -1
  • ng.newbie  · 技术社区  · 6 年前

    我很好奇 getResponseAsStream 因为httpclient实际上正在工作。

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

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

    以一个特定的rest服务请求返回生成的json为例 服务器将把它存储在哪里,以便它可以流式传输到客户机 ?主存储器是唯一的选择。

    如果是这样的话,你就不能解决内存耗尽的问题。 这到底是怎么回事?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Thomas Stets    6 年前

    考虑以下极其简化的场景:

    服务器通过读取大文件等方式生成大量数据。它通过输出流将数据写入发送缓冲区。网络堆栈从发送缓冲区读取数据并将数据包发送到客户端。这里输入的数据被放入一个接收缓冲区。

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

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

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

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