我有这个,其中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
的大小上面的代码。对?
有没有见过这样的人?
因此,即使缓冲区为1024,结果字符串也是1022,因为可能是unicode原因?
无论如何,正如评论所暗示的那样,String(buffer, 0, bytes)
做了伎俩而不需要substring()
。