如果读取字节数为0,是否有任何理由继续读取InputStream?

通常,当我处理InputStream, 停止读取的条件是当读取字节数小于或等于 0

例如,

InputStream in = new FileInputStream(src);
OutputStream out = new FileOutputStream(dst);

// Transfer bytes from in to out
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
    out.write(buf, 0, len);
}

但是,当我查看文档时 InputStream

https://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#read(byte[])

只有我注意到

-1 如果由于已到达流末尾而没有更多数据。

我想知道,我应该将我的代码重构为

InputStream in = new FileInputStream(src);
OutputStream out = new FileOutputStream(dst);

// Transfer bytes from in to out
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) != -1) {
    if (len > 0) {
        out.write(buf, 0, len);
    }
}

是否会有任何边缘情况检查while ((len = in.read(buf)) > 0)会导致任何不需要的错误?

回答

由于read指定阻塞直到数据可用,它返回的唯一方法0是您输入的缓冲区的长度为 0(这将是一个非常无用的缓冲区)。

请参阅JavaDoc:

此方法会阻塞,直到输入数据可用、检测到文件结尾或抛出异常。

如果 b 的长度为零,则不读取字节并返回 0;否则,将尝试读取至少一个字节。

所以四种可能的情况是:

  1. bbyte[]长度为 0 的一个,所以返回 0
  2. 输入数据可用:非零字节将被读入b并返回该数字。
  3. 检测到文件结尾:-1 将被返回
  4. 抛出异常:当方法异常返回并出现异常时,不返回任何值。

以上是如果读取字节数为0,是否有任何理由继续读取InputStream?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>