java调用read方法_java – 使用read与IOUtils.copy从InputStream读取

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

这个问题是它停留在复制线上并且永远不会超过这一点.

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

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

}

最佳答案 我猜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,表示已到达流的末尾.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值