HttpURLConnection 返回的 InputStream 中的数据在你读取之前存储在哪里?

Posted

技术标签:

【中文标题】HttpURLConnection 返回的 InputStream 中的数据在你读取之前存储在哪里?【英文标题】:Where is the data in the InputStream returned by HttpURLConnection stored before you read it? 【发布时间】:2014-09-17 16:30:54 【问题描述】:

我正在编写一个使用HttpURLConnection 下载一些数据的安卓应用。 getInputStream() 方法返回一个 InputStream,我可以从中读取数据。在我从这个流中读取之前,数据存储在哪里?是否已全部下载并且网络堆栈正在处理它?或者是否还有需要从服务器检索的数据?我可以关闭连接并仍然从 InputStream 中读取吗?我的问题是关于性能和在数据很大的情况下做一些负责任的事情。

【问题讨论】:

【参考方案1】:

在我从这个流中读取之前,数据存储在哪里?

(我不知道。你必须阅读源代码。)

它是否已全部下载,并且网络堆栈正在负责保存它?

不,它是一个流。数据以字节流的形式到达,您可以从流中读取。

或者是否还有需要从服务器检索的数据?

是的,这是正常情况,尤其是当负载重量超过几千字节时。

我可以关闭连接并仍然从 InputStream 中读取数据吗?

简短回答:不。

您的意思是从HttpURLConnection 呼叫disconnect()?不确定这是否可能,但我不会那样做。它表示您不想在不久的将来发出后续请求。这可能意味着连接将在物理上关闭。

或者你的意思是打电话给InputStream.close()?我很确定当您尝试从封闭的流中读取时,您会得到某种 IllegalStateExceptionIOException


通常HttpURLConnection 是您应用的不错选择。如果您遇到任何问题,可以查看这个(不完整)list of libraries and helpers,您可以在 android 上执行 HTTP 请求时使用它来让您的生活更轻松。也许您可以利用android.app.DownloadManager。

【讨论】:

以上是关于HttpURLConnection 返回的 InputStream 中的数据在你读取之前存储在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

HttpURLConnection发送和接受返回值

HttpURLConnection.getResponseCode() 在第二次调用时返回 -1

HttpURLConnection 返回汉字乱码(全是问号)

HttpURLConnection 返回的 InputStream 中的数据在你读取之前存储在哪里?

HttpURLConnection 通过代理访问时返回 503 错误

HttpURLConnection 当作请求调用接口不带返回参数的工具类