Java中的InputStream read()如何确定要读取的字节数?

Java中的InputStream read()如何确定要读取的字节数?,java,inputstream,Java,Inputstream,文档说“从输入流中读取一定数量的字节,并将它们存储到缓冲区数组b中。” Java中的InputStream read()如何确定字节数?缓冲区数组有一个定义的长度,称之为n。read()方法将读取1到n字节。除非检测到EOF,否则它将阻塞,直到至少有一个字节可用。我认为混淆来自“读取”的含义 read() 但是,由于您正在使用的特定InputStream的实现细节,包含正在读取字节的源可能会读取多个字节,以便告诉您下一个字节: 如果您的InputStream被缓冲,那么整个缓冲区长度可能会被读入

文档说“从输入流中读取一定数量的字节,并将它们存储到缓冲区数组b中。”


Java中的InputStream read()如何确定字节数?

缓冲区数组有一个定义的长度,称之为
n
read()
方法将读取1到
n
字节。除非检测到EOF,否则它将阻塞,直到至少有一个字节可用。

我认为混淆来自“读取”的含义

read()

但是,由于您正在使用的特定InputStream的实现细节,包含正在读取字节的源可能会读取多个字节,以便告诉您下一个字节:

  • 如果您的InputStream被缓冲,那么整个缓冲区长度可能会被读入内存,只是为了告诉您下一个字节是什么。但是,在内存缓冲区耗尽之前,对read()的后续调用可能不需要再次读取底层源
  • 如果您的InputStream正在读取压缩文件,那么底层源可能需要读入几个字节来解压缩数据,以便返回下一个解压缩的字节

  • 包装其他输入流的输入流层,例如
    new GZIPInputStream(new BufferedInputStream(new FileInputStream(file)))将根据图层使用上面的#1和#2


  • 它在描述中说。。它尝试在不阻塞的情况下读取尽可能多的内容。例如,如果您处理的是FileInputStream,Java会要求操作系统为其提供操作系统读取缓冲区中的字节数。因此,只要缓冲区未满,它就会读取尽可能多的字节?我觉得文档不清楚,应该参考某个扩展InputStream的类。这个特定的方法是抽象的,因此它不能准确地解释它将如何在扩展InputStream的流类上实现。实际上,InputStream的文档并没有说它将读取尽可能多的数据。只要它能够读取至少一个,并且最多可以读取数组中所能容纳的数量。否则,就没有承诺会读多少。可以是任何数字。