有没有办法在不对 InputStream 对象本身使用流解码器的情况下将 InputStream 数据解码为文本?
Is there a way to decode InputStream data to text without using a Stream Decoder on the InputStream Object itself?
我制作了一个蓝牙 InputStream 侦听器,只需询问 if(InputStream.isAvailable > 0)
即可检查是否有传入数据,然后创建一个循环将传入数据存储到 int[]
中,直到没有更多数据为止,并且它工作得很好。我正在使用一个简单的 Log.d
记录器来输出结果。我仍然是初学者,可以理解基本概念。通过我的蓝牙设备发送到我的 phone 的文本是 "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);
}
我之所以这样做,是为了在发送一个session数据后立即输出传入的数据。
糟糕的代码。不要像那样使用单字符读取功能——这是非常低效的。确定缓冲区大小并使用字节数组版本。然后,您可以通过 new String(array, 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();
我制作了一个蓝牙 InputStream 侦听器,只需询问 if(InputStream.isAvailable > 0)
即可检查是否有传入数据,然后创建一个循环将传入数据存储到 int[]
中,直到没有更多数据为止,并且它工作得很好。我正在使用一个简单的 Log.d
记录器来输出结果。我仍然是初学者,可以理解基本概念。通过我的蓝牙设备发送到我的 phone 的文本是 "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);
}
我之所以这样做,是为了在发送一个session数据后立即输出传入的数据。
糟糕的代码。不要像那样使用单字符读取功能——这是非常低效的。确定缓冲区大小并使用字节数组版本。然后,您可以通过 new String(array, 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();