当前位置: 首页 > 知识库问答 >
问题:

决定从输入流读取的字节数的因素

邢思淼
2023-03-14

从urlConnection获得的InputStream向ByteArrayOutputStreet写入数据的处理。getInputStream()花费的时间超过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中可用
文件的内容长度为7631029(字节)。

我有两个问题:

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

共有1个答案

暨弘懿
2023-03-14
  1. 尽管字节数组大小为16384,状态代码为200,但inputStream。read方法平均只读取2800字节。为什么以及哪些因素决定了这些字节

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

让发送者发送得更快。您的接收代码没有任何问题,尽管我想知道为什么您在对它做任何事情之前要在< code > ByteArrayOutputStream 中收集整个响应。这只会浪费内存并增加延迟。

 类似资料:
  • 问题内容: 我正在使用从运行约一分钟的进程中读取stdout。 我该如何stdout以流方式打印出该流程的每一行,以便可以看到生成的输出,但仍然阻止该流程终止,然后再继续? 似乎一次给出所有输出。 问题答案: 这是一个简单的示例(不检查错误): 如果ls结束太快,则while循环可能会在你读取所有数据之前结束。 你可以通过以下方式在中捕获其余部分:

  • 问题内容: 当输入零作为输入时,我需要停止询问整数输入,并立即开始求和。当我键入零时,我的程序不会停止。我需要它停止并开始汇总它收集的所有输入。 这是我所拥有的: ///////////////有效的最终代码。谢谢!公共类Inttosum { 问题答案: 您正在使用一种称为循环条件的东西,但是在循环中更新了变量。您可以使用循环。更改 像 使用 我也建议先打电话再打电话。而且,由于您不使用(只是),

  • 我试图从一个读取。我写了下面的代码 我不明白的是我应该在一次迭代中读取多少字节?流包含保存在磁盘上的文件。 我在这里读过,但我并不真正理解这篇文章。

  • 我正在创建一个Java客户机程序,它向服务器发送一个命令,然后服务器返回一个确认和一个响应字符串。 响应以这种方式发回 客户端代码 public static void readStream(InputStream in){ 输出 客户端读取的完整响应 谢谢

  • 我目前正试图从服务器读取图像文件,但得到的数据不完整或 这与缓冲区大小有关吗?我已经尝试使用静态大小而不是ContentLength。敬请指教。

  • 问题内容: 我知道 bufio 包中的golang中的特定功能。 Peek返回下一个n个字节, 而不会使阅读器前进 。在下一个读取调用中,字节停止有效。如果Peek返回的字节数少于n个字节,则它还会返回一个错误,解释读取短的原因。如果n大于b的缓冲区大小,则错误为ErrBufferFull。 我需要能够从阅读器读取特定数量的字节,以 使阅读器更先进 。基本上,与上面的功能相同,但是它使阅读器更高级