【发布时间】:2018-02-17 10:27:20
【问题描述】:
从urlConnection.getInputStream()获取的InputStream向ByteArrayOutputStream写入数据的处理耗时1分钟以上。
代码 片段
URL requestUrl= new URL(_sampleurl_);
HttpURLConnection urlConnection=(HttpURLConnection)requestUrl.openConnection();
urlConnection.setConnectTimeout(10000);
urlConnection.setReadTimeout(10000);
urlConnection.setRequestMethod("GET");
urlConnection.connect();
int statusCode=urlConnection.getResponseCode(); //200
long contentLengthByTen = urlConnection.getHeaderFieldLong("Content-Length", _defaultSize_); //7631029
InputStream inputStream = urlConnection.getInputStream();
final byte[] byteArray = new byte[16384];
int length;
ByteArrayOutputStream byteArrOutStrm = new ByteArrayOutputStream();
int k = 0;
while ((length = inputStream.read(byteArray)) != -1)
{
byteArrOutStrm.write(byteArray, 0, length);
k++;
}
一些观察结果是:
while 循环单独执行超过一分钟,它迭代了大约 2650 次。
HttpURLConnection 响应码为 200,因此整个内容都在 InputStream 中可用。
该文件的 Content-Length 为 7631029(字节)。
我有两个问题:
- 虽然字节数组大小为16384,状态码为200,但inputStream.read方法平均只读取2800字节。为什么以及哪些因素决定了这些字节?
- 减少处理时间的适当解决方案?
【问题讨论】:
-
"HttpURLConnection 响应码为 200,因此整个内容都在 InputStream 中可用。"这并不意味着整个内容已经发送。
-
因此,这也不意味着现在可以在套接字接收缓冲区中获得全部内容,以便在一次读取中读取。发送端仍然存在 I/O 和刷新、分段和打包,以及网络中的丢包和重传。
-
是的。我误会了,200状态码表示请求成功完成,实际上表示请求成功(OK)。
标签: networking inputstream httpurlconnection bytearrayoutputstream