使用read与IOUtils.copy从InputStream中读取

时间:2014-11-13 17:06:31

标签: java android sockets bluetooth

我尝试使用2种方法,以便通过蓝牙套接字从InputStream读取。

第一个是:

InputStream inputStream = bluetoothSocket.getInputStream();
byte[] buffer = new byte[1024];
inputStream.read(buffer);
String clientString = new String(buffer, "UTF-8");

这个问题的一个问题是现在clientString原来的消息加上" 0"直到缓冲区已满(如果我将第一个字节用作指示符,我可以知道消息的长度,但我尽量不这样做。)

第二个是(使用IOUtils中的Apache Commons IO类):

InputStream inputStream = bluetoothSocket.getInputStream();
StringWriter writer = new StringWriter();
IOUtils.copy(inputStream, writer, "UTF-8");
String clientString = writer.toString();

这个问题在于它停留在copy行,并且永远不会超过这一点。

所以,我的问题是,这些方法有什么不同,为什么我会得到不同的结果?

客户端的代码是(C#Using 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();
}

1 个答案:

答案 0 :(得分:2)

我猜IOUtils类来自Apache Commons IO。它从inputStream复制到writer,直到它到达流的末尾(从流上的read方法返回-1)。您的第一种方法只是尝试读取最多1024个字节然后继续。

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

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

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