有没有办法在不使用InputStream对象本身的Stream Decoder的情况下将InputStream数据解码为文本?

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

我已经制作了一个蓝牙InputStream监听器,它只是通过询问if(InputStream.isAvailable > 0)检查是否有传入数据,然后创建一个循环来将传入的数据存储到int[],直到没有更多并且它完美地工作。我正在使用一个简单的Log.d记录器来输出结果。我还是初学者,可以理解基本概念。通过我的蓝牙设备发送到我的手机的文本是"Hello Android!",但是它被编码成整数,我想将int[]转换为String,这样我就可以获得编码文本而无需使用流解码器,但是整数。可能吗?按预期工作的实际输出如下:72, 101, 108, 111, 32, 65, 110, 100, 114, 111, 105, 100, 33, 13, 10,。当然,所有这些都不是同时到达的,因为它们是逐个发送的,没有什么可担心的,因为我将使用自己的分隔符来确定一个完整数据的开始和结束。

我的代码:

if(mmInputStream.available() > 0) {

    int[] receivedBytes = new int[1024];
    int i = 0;

    while(mmInputStream.available() > 0) {
        receivedBytes[i] = mmInputStream.read();
        i++;
    }

    String s = "";

    for(int j = 0; j < i; j++){
        s += receivedBytes[j] + ", ";
    }

    Log.d("INPUTSTREAM_DATA", s);

}

我这样做的原因是,一旦发送一个数据会话就立即输出传入的数据。

java android bluetooth inputstream
1个回答
1
投票

可怕的代码。不要使用像这样的单字符读取功能 - 这是非常低效的。确定缓冲区大小并使用字节数组版本。然后,您可以通过new String(array, encoding)将整个字节数组转换为字符串,其中encoding是数据的编码(UTF-8,UTF-16等)。

并且不要使用+来连接类似的字符串 - 字符串是不可变的,因此每次使用都会导致创建一个新对象。请改用StringBuilder。更好的代码看起来像这样(忽略所需的异常处理)

int BUFFER_SIZE = 1024;
StringBuilder builder = new StringBuilder();
byte data[] = new byte[BUFFER_SIZE];
while(inputStream.available() > 0) {
   int read = inputStream.read(data);
   builder.append(new String(data, 0, read, "UTF-8"));
}
return builder.toString();
© www.soinside.com 2019 - 2024. All rights reserved.