如果读取字节数为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;否则,将尝试读取至少一个字节。
所以四种可能的情况是:
b是byte[]长度为 0 的一个,所以返回 0- 输入数据可用:非零字节将被读入
b并返回该数字。 - 检测到文件结尾:-1 将被返回
- 抛出异常:当方法异常返回并出现异常时,不返回任何值。