为什么HTTP客户端需要InputStream?(Java)

4

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

我目前正在使用的客户端是Apache的HTTP Components客户端

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

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

4个回答

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

2
是的,但是当我得到我的响应对象时,数据已经被接收并且连接已经关闭了 - 对吗? - Dexter
2
不是这样的。HttpClient从底层连接中流式传输数据,该连接至少保持打开状态,直到响应实体正文完全被消耗。 - ok2c

2

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


1
除了已经提到的内容外,在以下场景中,输入流是必需的:HTTP服务器向在带-Xmx512M的JVM中运行的客户端提供1 GB响应。 getBytes()或getString()只会导致OutOfMemoryError,而读取输入流(每次1K)是完全合理的。

那么数据直到我从输入流中读取它时才会被读入JVM的内存中?我一直以为客户端会执行其http操作,然后关闭连接,而不管我对响应做什么。 - Dexter
这完全取决于客户端,但在上述情况下,将整个响应读入内存的客户端将会崩溃。据我所知,在HttpClient(实际上是HttpMethodBase)中,它取决于使用方式,无论是将响应作为字节数组读入内存还是返回输入流供客户端通过网络读取数据。 - Costi Ciudatu


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接