【问题标题】:Read from InputStream using read vs. IOUtils.copy使用 read vs. IOUtils.copy 从 InputStream 中读取
【发布时间】:2014-11-13 17:06:30
【问题描述】:

我正在尝试使用 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# 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();
}

【问题讨论】:

    标签: java android sockets bluetooth


    【解决方案1】:

    我猜 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表示到达流的末尾。

    【讨论】:

    • 但它为什么不停止呢?
    • 这可能取决于 InputStream 的实现,例如它可以返回它当前保存在缓冲区中的字节。没有义务读取提供的完整缓冲区。
    猜你喜欢
    • 2015-10-27
    • 1970-01-01
    • 2012-03-03
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    相关资源
    最近更新 更多