为什么BufferedInputStream.read()在用于返回0时在Android Nougat中返回-1?

时间:2016-10-19 14:52:49

标签: android

在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

1 个答案:

答案 0 :(得分:3)

根据InputStream.read(byte[] b, int off, int len)的文档,除非len参数为0,否则该方法实际上永远不会返回0:

  

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

     

如果len为零,则不读取任何字节,返回0;除此以外,   试图读取至少一个字节。如果没有可用的字节   因为流在文件的末尾,返回值-1;   否则,至少读取一个字节并存储到b。

因此,反向流实现是错误的,因此BufferedInputStream的行为是不确定的。