gpt4 book ai didi

java - 使用 read 与 IOUtils.copy 从 InputStream 读取

转载 作者:太空宇宙 更新时间:2023-11-03 10:19:25 24 4
gpt4 key购买 nike

我正在尝试使用 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。它从 inputStream 复制到 writer,直到它到达流的末尾(-1 从流上的 read 方法返回)。您的第一个方法只是尝试读取最多 1024 个字节,然后继续。

此外,inputStream.read(buffer) 将返回读取的字节数。因此,当您创建 String 时,您可以使用它:

int read = inputStream.read(buffer);    
String clientString = new String(buffer, 0, read, "UTF-8")

您还需要检查 read 方法是否返回 -1 表示已到达流的末尾。

关于java - 使用 read 与 IOUtils.copy 从 InputStream 读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26914404/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com