【问题标题】:Why the need for InputStream in HTTP Clients? (Java)为什么 HTTP 客户端需要 InputStream? (爪哇)
【发布时间】:2011-08-20 19:33:21
【问题描述】:

我一直在使用 Java 中的各种 HTTP 客户端从网站获取各种信息或使用网络服务(如谷歌地图地理编码器)

我正在使用的当前客户端是来自 Apache 的 HTTP Components client

我一直想知道为什么没有 .getText() 或 .getBytes() 方法可以简单地为我提供 url 的所有内容,而是有返回 InputStream 的方法。这样做的意义或原因是什么?

这不像我不断地与服务器通信,所以我必须不断检查流。 HTTP 是无状态的,那么为什么没有 getText()/getBytes() 方法在收到 HTTP 响应后简单地返回其内容(如 String 或 byte[])?

【问题讨论】:

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


    【解决方案1】:

    因为服务器开始以流的形式输出结果,而客户端则以这种方式获取结果。您可以在内存中缓冲该流并将其转换为 String / byte[],但您也可以处理其中的一部分并将其丢弃。

    【讨论】:

    • 是的,但是当我得到我的响应对象时,数据已经收到并且连接已经关闭 - 对吧?
    • 并非如此。 HttpClient 流式传输来自底层连接的数据,该连接至少在响应实体主体被完全消耗之前保持打开状态
    【解决方案2】:

    因为它是一个网络;因为它是一个流;因为服务器响应可以任意大。同样的道理也适用于文件。

    【讨论】:

      【解决方案3】:

      除了已经提到的内容之外,输入流对于以下场景是必需的:HTTP 服务器向运行在带有 -Xmx512M 的 JVM 中的客户端提供 1 GB 响应。 getBytes()getString() 只能产生 OutOfMemoryError,而读取输入流(一次 1K)非常有意义。

      【讨论】:

      • 所以在我从输入流中读取数据之前,数据不会被读取到 JVM 的内存中?我总是假设客户端做的是 http 的东西,然后关闭连接,不管我对响应做什么。
      • 这完全取决于客户端,但在上述场景中,将整个响应读入内存的客户端只会崩溃。据我所知,在HttpClient(实际上是HttpMethodBase)中,响应是作为字节数组读入内存还是返回输入流供客户端通过网络读取数据,取决于使用情况。
      【解决方案4】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-28
        • 2017-12-23
        • 1970-01-01
        • 1970-01-01
        • 2019-10-18
        • 2012-05-24
        • 2016-08-12
        • 2010-11-08
        相关资源
        最近更新 更多