我正在尝试使用 2 种方法通过蓝牙套接字从InputStream
读取。
第一个是:
InputStream inputStream = bluetoothSocket.getInputStream();
byte[] buffer = new byte[1024];
inputStream.read(buffer);
String clientString = new String(buffer, "UTF-8");
这个问题的问题是,现在在clientString
有原始消息加"0",直到缓冲区已满(如果我使用第一个字节作为指标,我可以知道消息的长度,但我尽量不这样做)。
第二个是(使用Apache Commons IO
中的IOUtils
类):
InputStream inputStream = bluetoothSocket.getInputStream();
StringWriter writer = new StringWriter();
IOUtils.copy(inputStream, writer, "UTF-8");
String clientString = writer.toString();
这个问题的问题在于它保持在copy
线上,永远不会超过这一点。
所以,我的问题是,这些方法之间有什么区别,为什么我得到不同的结果?
客户端的代码是(C# 使用 32feet
):
client.Connect(BluetoothEndPoint(device.DeviceAddress, mUUID));
bluetoothStream = client.GetStream();
if (client.Connected == true && bluetoothStream != null)
{
byte[] msg = System.Text.Encoding.UTF8.GetBytes(buffer + "n");
bluetoothStream.Write(msg, 0, msg.Length);
bluetoothStream.Flush();
}
我猜IOUtils类来自Apache Commons IO。它从输入流复制到编写器,直到它到达流的末尾(-1 从流上的读取方法返回)。您的第一种方法只是尝试读取最大 1024 字节,然后继续。
此外,inputStream.read(buffer) 将返回读取的字节数。因此,当您创建字符串时,您可以使用它:
int read = inputStream.read(buffer);
String clientString = new String(buffer, 0, read, "UTF-8")
您还需要检查 read 方法是否返回 -1,指示已到达流的末尾。