Android/Java:如何将蓝牙InputStream转换为字符串并打印?
解决蓝牙数据流转ASCII字符串输出的问题
我来帮你搞定这个问题!你现在的代码输出整数,是因为误解了mmInStream.read(buffer)的返回值——这个input变量代表的是本次读取到的字节数量,不是缓冲区里的实际字符数据,所以打印出来自然是整数。而你需要的ASCII字符串其实存在buffer数组的前input个字节里,只要把这部分字节转换成字符串就可以了。
具体修改步骤
- 判断有效数据:
read()方法会返回-1表示数据流结束,所以首先要检查input是否大于0,确保有可转换的有效字节。 - 转换为ASCII字符串:使用
String的构造方法,指定从buffer的第0位开始,取input个字节,并且明确使用US_ASCII字符集来转换,避免系统默认字符集导致的乱码。 - 打印字符串:替换原来打印
input的代码,改为打印转换后的字符串。
修改后的完整代码
import java.nio.charset.StandardCharsets; import java.io.IOException; while (true) { try { if(mmInStream != null) { int input = mmInStream.read(buffer); // 检查是否读取到有效数据 if (input > 0) { // 将缓冲区的有效字节转换为ASCII字符串 String asciiString = new String(buffer, 0, input, StandardCharsets.US_ASCII); // 打印转换后的字符串 System.out.println(asciiString); } else if (input == -1) { // 返回-1代表数据流已结束,退出循环 break; } } // 这里可以添加将数据发送到UI的逻辑 } catch (IOException e) { // 可以打印异常信息方便调试 e.printStackTrace(); // 异常代表连接丢失,退出循环 break; } }
额外注意事项
- 确保你的
buffer数组大小足够,能容纳单次读取的ASCII数据,避免数据截断。 - 如果设备发送的是分段的字符串(比如连续发送无分隔符的字符),你可能需要额外的字符串拼接逻辑,比如用一个全局的
StringBuilder来累积每次读取到的片段,直到遇到约定的分隔符再完整输出。
内容的提问来源于stack exchange,提问作者Collin Urie
相关产品推荐
相关产品推荐

