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

为什么BufferedInputStream.read()在Android Nougat中用于返回0时返回-1?,android,Android,在安卓N设备上测试我的应用程序时,我发现我在使用BufferedInputStream的方式上有很多新问题。问题似乎在于如何解释BufferedInputStream.read()的返回值。如果返回0,则我假设可以从基础流读取0个字节;如果返回-1,则我假设基础流已到达文件末尾(并退出读取)。这在牛轧糖之前效果很好。现在,当底层InputStream.read()返回0时,BufferedInputStream.read()返回-1。正确的行为是什么?为什么会发生变化 这里是一个提炼的例子

在安卓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零字节读取测试:BufferedInputStream返回=-1。Android版本=24


10-19 09:32:19.200 12675 12675 D零字节读取测试:BufferedInputStream返回=0。Android版本=23根据的文档,该方法实际上不应该返回0,除非
len
参数为0:

此方法会一直阻止,直到输入数据可用为止,文件结束时间为 检测到,或引发异常

如果len为零,则不读取字节,返回0;否则,, 试图读取至少一个字节。如果没有可用的字节 因为流位于文件的末尾,所以返回值-1; 否则,至少读取一个字节并将其存储到b中


因此,反序列化流实现是有缺陷的,因此
BufferedInputStream
的行为是不确定的。

请不要说BufferedInputStream返回了什么。它是返回值“return 0;”的read()函数。让您的read函数始终返回0。怪你自己。它什么也不读。@greenapps阅读了这个问题-这是为了测试
BufferedInputStream
在底层流返回0时的行为!我是@greg nield的同事。他在维护我的代码。只是提醒一下,有一个非标准的实现(在我的例子中是InputStream)是不明智的,不管你认为你的理由是什么。谢谢。这是一个很好的回答。我必须回顾我的InputStream是如何在应用程序中实现的。@GregNield感谢您的反馈!快乐编码:)