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

Java 针对URL流的InputStream.read()方法的性质,java,url,buffer,inputstream,Java,Url,Buffer,Inputstream,在实习期间,我遇到了如下所示的一个代码段(事实证明,这是这个问题的默认代码段) InputStream input = new BufferedInputStream(url.openStream()); OutputStream output = new FileOutputStream(file); byte data[] = new byte[1024]; int total = 0; int

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

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字节

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

    没有。这是武断的。我用8192。您发布的代码将适用于任何大于等于1的大小

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

    不,您将在每次迭代中得到一个异常或流结束,或者至少得到一个字节

    那么每次迭代的计数变量是10241024,2还是可能是10001000,50

    除非出现异常或流结束,否则每次迭代都可以使用大于等于1字节的任何内容

    若我们的连接速度非常慢,那个么read()方法是否可能尝试填充1024字节的缓冲区,即使它需要几分钟的时间

    否。它将阻塞,直到读取至少一个字节,或者出现异常或流结束


    这在Javadoc中都有说明。

    I/O操作非常昂贵,因此通常建议对其进行批处理,因此在您的情况下,它是1KB,您可以根据需要将其更改为更多/更少。 您必须记住,它正在阻止调用,所以它太大了,您可能会觉得您的程序没有移动


    您不应该逐字节读取数据,因为这是太多的I/O操作,并且程序将全部时间都花在I/O上,所以大小应该取决于您处理数据的速度。

    @BorisTheSpider No,在读取缓冲区已满之前,它不会阻塞。请参阅Javadoc。@EJP完全正确。轻微的大脑放屁。不回答被问到的问题。同意答案不在要点中,但足以回答问题。