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