决定从InputStream读取的字节数的因素

时间:2017-09-08 13:16:31

标签: networking inputstream httpurlconnection bytearrayoutputstream

在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(字节)。

我有两个问题:

  1. 虽然字节数组大小为16384且状态代码为200,但inputStream.read方法平均只读取2800个字节。为什么和哪些因素决定这些字节?
  2. 适当的解决方案,以减少处理时间?

1 个答案:

答案 0 :(得分:1)

  
      
  1. 虽然字节数组大小为16384且状态代码为200,但inputStream.read方法平均只读取2800个字节。为什么以及哪些因素决定这些字节?
  2.   

套接字接收缓冲区中可用的字节数,而后者又是发送方速度,接收方读取频率,网络带宽和路径MTU的函数。您所看到的并不令人惊讶:它表明您与发件人保持良好关系。

  
      
  1. 适当的解决方案,以减少处理时间?
  2.   

让发件人发送得更快。您的接收代码没有任何问题,但我想知道为什么您在使用ByteArrayOutputStream之前收集整个响应。这只会浪费内存并增加延迟。