在urlConnection.getInputStream()获取的InputStream中,在ByteArrayOutputStream中写入数据的处理时间超过1分钟。
代码 SNIPPET
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(字节)。
我有两个问题:
答案 0 :(得分:1)
- 虽然字节数组大小为16384且状态代码为200,但inputStream.read方法平均只读取2800个字节。为什么以及哪些因素决定这些字节?
醇>
套接字接收缓冲区中可用的字节数,而后者又是发送方速度,接收方读取频率,网络带宽和路径MTU的函数。您所看到的并不令人惊讶:它表明您与发件人保持良好关系。
- 适当的解决方案,以减少处理时间?
醇>
让发件人发送得更快。您的接收代码没有任何问题,但我想知道为什么您在使用ByteArrayOutputStream
之前收集整个响应。这只会浪费内存并增加延迟。