在我的实习期间,我遇到了一个代码(这个问题的默认代码),如下所示。
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字节
答案 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上,因此大小应取决于您可以处理数据的速率。