我有这个,其中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
的大小。正确?
有人见过这样的事吗?
答案 0 :(得分:0)
所以即使缓冲区是1024,结果字符串也是1022,可能是unicode原因?
无论如何,正如评论建议的那样,String(buffer, 0, bytes)
完成了诀窍而不需要substring()
。