Java 读取流时,为什么不在读取0字节时停止迭代

Java 读取流时,为什么不在读取0字节时停止迭代,java,Java,从流读取时的标准习惯用法是检查EOF(-1): 这看起来很标准——我查看了ApacheCommons等流行库的源代码,它似乎是事实上的标准 我们为什么不也停在0呢?-1不是更好吗?当我们没有阅读任何东西时,为什么要做循环中的任何工作?基本上是因为这是毫无意义的。看看下面的例子: 如果b的长度为零,则不读取字节,返回0;否则,将尝试读取至少一个字节。如果由于流位于文件末尾而没有可用字节,则返回值-1;否则,至少读取一个字节并存储到b 因此,除非您传入一个空缓冲区(这在几乎所有情况下基本上都是一个b

从流读取时的标准习惯用法是检查EOF(-1):

这看起来很标准——我查看了ApacheCommons等流行库的源代码,它似乎是事实上的标准


我们为什么不也停在0呢?
-1
不是更好吗?当我们没有阅读任何东西时,为什么要做循环中的任何工作?

基本上是因为这是毫无意义的。看看下面的例子:

如果
b
的长度为零,则不读取字节,返回0;否则,将尝试读取至少一个字节。如果由于流位于文件末尾而没有可用字节,则返回值-1;否则,至少读取一个字节并存储到
b


因此,除非您传入一个空缓冲区(这在几乎所有情况下基本上都是一个bug;我个人希望该方法在这种情况下抛出一个异常),否则返回值永远不会是0。它将阻塞至少一个要读取的字节(在这种情况下,返回值将为1或更多),或者阻塞要到达的流的末尾(在这种情况下,返回值将为-1)。

基本上是因为它没有意义。看看下面的例子:

如果
b
的长度为零,则不读取字节,返回0;否则,将尝试读取至少一个字节。如果由于流位于文件末尾而没有可用字节,则返回值-1;否则,至少读取一个字节并存储到
b


因此,除非您传入一个空缓冲区(这在几乎所有情况下基本上都是一个bug;我个人希望该方法在这种情况下抛出一个异常),否则返回值永远不会是0。它将阻塞至少一个要读取的字节(在这种情况下,返回值将为1或更多),或者阻塞要到达的流的末尾(在这种情况下,返回值将为-1)。

最后一位不应该读取吗“在这种情况下,返回值将为-1”?@VGR:Whoops,yes-fixed:)最后一位不应该读取吗“在这种情况下,返回值将为-1”@VGR:Whoops,yes-fixed:)
while((bytesRead = inputStream.read(buffer)) != -1)