确定 ByteBuffer 中的字节数

34

我有一个ByteBuffer,最多可以容纳(4 + sizebytes(即整数后跟size个字符)。 然而,向ByteBuffer写入的字符数可能小于size

所以我想知道,有没有办法确定写入 ByteBuffer 中的字符数,而不仅仅是其总大小?limitposition等似乎不是我要找的。

谢谢您的帮助!


hasRemaining 怎么样? - PM 77-1
hasRemaining 返回一个布尔值,指示是否还有剩余内容,而不是剩余多少字节。 - Paul Rooney
2个回答

41

在向ByteBuffer写入数据后,您可以使用position()方法找到已写入的字节数。

如果您随后flip()缓冲区,则可以使用limit()remaining()方法找到缓冲区中的字节数。

如果您随后读取部分缓冲区,可以使用remaining()方法找到剩余的字节数。


@Girl 你无法知道实际写入的字节数,因为 ByteBuffer 本质上是“可寻址”的。你的写入模式是什么?你只使用绝对读/写方法,还是相对读/写方法? - fge
@fge 我基本上是从 DatagrampPacket 中读取内容。我知道 DatagramPacket 内容的最大大小将为 4 + size。但是,可能在 int 之后的字符数少于 size。因此,我只是想确定实际上有多少个字符在 DatagramPacket 中。感谢您的帮助。 - user2268507
@fge 我不确定这是否是您的意思:byte[] buffer = new byte[4 + size]; DatagramPacket request = new DatagramPacket(buffer, 4 + size); receiver_Socket.receive(request); int length = request.getLength() - request.getOffset() + 1; 结果是 length = 20,因为 size 是15。也就是说,request.getOffset() 等于0。在此数据包中,我故意发送了少于 size 字符的内容。抱歉有点凌乱... - user2268507
另一种选择可能是在发送数据包时添加一个额外的 int 来包含字符数。 - user2268507
@Giri - 抱歉耽搁了。正如fge所指出的,ByteBuffer是可寻址的,具有position(int)方法。然而,您可能会控制这是否发生以及何时发生,并将其纳入考虑。如果位置不从0开始,您可以在向缓冲区写入之前获取位置,然后在写入后获取位置,并将后者减去前者。 - Andy Thomas
显示剩余2条评论

3
DatagramChannel channel = DatagramChannel.open();
ByteBuffer bb = ByteBuffer.allocate(5+size);
channel.receive(bb);
bb.flip();
// actual length of received packet
int len = bb.remaining();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接