Android - InputStream的缓冲区大小有变化吗?这应该是不可能的

问题描述 投票:0回答:1

我有这个,其中mmInputStream是蓝牙连接的InputStream:

    int bytes;
    boolean hasData;

    while (!isInterrupted()){

        byte[] buffer = new byte[1024];
        hasData = false;

        try {
            bytes = mmInStream.read(buffer);
            if (bytes > 0) {
                hasData = true;
            }
        } catch (IOException e){
            Log.d(TAG, e.getMessage());
            break;
        }

        if (hasData)  {
            final String data = new String(buffer).substring(0, bytes);
        }

在我的猴子测试中(使用App / UI Exerciser),我得到了其中一个:

java.lang.StringIndexOutOfBoundsException: length=1022; regionStart=0; regionLength=1024
    at java.lang.String.startEndAndLength(String.java:583)
    at java.lang.String.substring(String.java:1464)
    at com.mikehelland.omgbananasremote.BluetoothConnection.run(BluetoothConnection.java:80)

我不知道甚至可以远程实现缓冲区的长度最终会比每个循环的初始化时更少。

除非我完全不理解Java,当我将buffer数组传递给read()时,它是通过引用,并且你不能改变数组的大小,所以read不应该能够改变buffer的大小上面的代码。对?

有没有见过这样的人?

android inputstream monkey
1个回答
0
投票

因此,即使缓冲区为1024,结果字符串也是1022,因为可能是unicode原因?

无论如何,正如评论所暗示的那样,String(buffer, 0, bytes)做了伎俩而不需要substring()

© www.soinside.com 2019 - 2024. All rights reserved.