在Android N设备上测试我的应用程序时,我发现我遇到了许多与使用BufferedInputStream的方式相关的新问题。问题似乎是我如何解释BufferedInputStream.read()的返回值。如果返回0,我假设0个字节可用于从基础流中读取,如果为-1,则假设基础流已到达文件末尾(并退出读取)。这一直很好,直到牛轧糖。现在,当底层InputStream.read()返回0时,BufferedInputStream.read()返回-1。什么是正确的行为?为什么这会改变?
这是一个提炼的例子......
class ZeroBytesReadInputStream extends InputStream {
...
@Override
public int read(byte[] buffer, int byteOffset, int byteCount) throws IOException {
return 0;
}
}
private int testZeroBytesReadBufferedInputStream() {
InputStream inputStream = new ZeroBytesReadInputStream();
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
int valueReturned = 0;
try {
byte[] toStream = new byte[100];
valueReturned = bufferedInputStream.read(toStream, 0, 100);
Log.d("Zero Bytes Read Test", "BufferedInputStream returned = " + valueReturned + ". Android Version = " + android.os.Build.VERSION.SDK_INT);
} catch (IOException e) {
e.printStackTrace();
}
return valueReturned;
}
运行时的输出 -
10-19 09:28:51.970 9138 9138 D Zero Bytes Read Test: BufferedInputStream returned = -1. Android Version = 24
10-19 09:32:19.200 12675 12675 D Zero Bytes Read Test: BufferedInputStream returned = 0. Android Version = 23
答案 0 :(得分:3)
根据InputStream.read(byte[] b, int off, int len)的文档,除非len
参数为0,否则该方法实际上永远不会返回0:
此方法将阻塞,直到输入数据可用,文件结尾为 检测到,或抛出异常。
如果len为零,则不读取任何字节,返回0;除此以外, 试图读取至少一个字节。如果没有可用的字节 因为流在文件的末尾,返回值-1; 否则,至少读取一个字节并存储到b。
因此,反向流实现是错误的,因此BufferedInputStream
的行为是不确定的。