针对URL流的InputStream.read()方法的性质

时间:2015-01-31 11:10:26

标签: java url buffer inputstream

在我的实习期间,我遇到了一个代码(这个问题的默认代码),如下所示。

InputStream input = new BufferedInputStream(url.openStream());
            OutputStream output = new FileOutputStream(file);
            byte data[] = new byte[1024];
            int total = 0;
            int count;
            while ((count = input.read(data)) != -1) {
                total += count;
                output.write(data, 0, count);
            }

所以这是我的问题。假设数据是2050字节

  1. 使用1024常量的原因是什么?
  2. 当我参加计算机网络课程时,我可以谈谈我的一些知识 对此     问题。假设我们有快速连接,我们将读取1024字节长     每次迭代的数据?所以计数变量为1024,1024,2     每次迭代还是可能1000,1000,50?
  3. 如果我们真的有     连接速度慢,read()方法可能会尝试填充     1024字节缓冲区,即使它需要几分钟?

2 个答案:

答案 0 :(得分:1)

  

使用1024常量的原因是什么?

无。这是武断的。我使用的是8192.您发布的代码可以使用任何大小> = 1。

  

假设我们有快速连接,我们会在每次迭代时读取1024字节长的数据吗?

不,您将获得异常或流结束或每次迭代至少1个字节。

  

因此,每次迭代计数变量为1024,1024,2或者可能是1000,1000,50?

除非发生异常或流结束,否则每次迭代都可以使用> = 1个字节。

  

如果连接速度很慢,read()方法是否可能尝试填充1024字节缓冲区,即使它需要几分钟的时间?

没有。它将阻塞,直到它读取至少一个字节或异常或流结束。

这一切都在Javadoc中说明。

答案 1 :(得分:-1)

I / O操作很昂贵,因此通常建议批量操作,因此在您的情况下它是1KB,您可以根据您的要求更改/更少。 你必须记住它是阻止通话,所以它太大你可能会觉得你的程序没有移动。

您也不应该逐字节读取,因为它太多的I / O操作,并且程序将仅花费在I / O上,因此大小应取决于您可以处理数据的速率。