如何改变ByteBuf里面的内容

前言

这两天学习Moquette,对ByteBuf做了点研究,对于maxCapacity有了进一步了解。

一、ByteBuf是什么?

最早是在netty中有接触,这算是是核心了,有很多文章进行介绍:

二、如何改变ByteBuf里面的内容

1.读取

读取方式有很多,比如读取成String

String payload = msg.payload().toString(StandardCharsets.UTF_8);

或者直接读取成byte[]

byte[] bytes = read(msg.payload());

public static byte[] read (ByteBuf datas) {
    byte[] bytes = new byte[datas.readableBytes()];
    datas.readBytes(bytes);
    return bytes;
}

2.改写

处理完毕读出来的数据,如何才能将处理好的数据重新写入到ByteBuf里呢。 这里涉及到writerIndex和readIndex, 上面的文章也提到很多,简单来说你可能要重置一下,然后再写入,比如:

msg.payload().resetReaderIndex();
msg.payload().resetWriterIndex();
msg.payload().writeBytes(bytes);

但我这边碰到一个问题, 就是我改写的数据比原来的数据长,于是我就想对ByteBuf进行扩容。 而我查到的文章里都提到了ByteBuf是可以动态扩容

这里一个核心的代码就是 capacity和maxCapacity的问题, 看了一遍源码,没找到如何修改maxCapacity的地方。而判断语句里,如果想扩容,必须小于maxCapacity。 除非不checkBound,但这个参数似乎不能轻易改变。

if (checkBounds && (targetCapacity < 0 || targetCapacity > maxCapacity)) {
    ensureAccessible();
    throw new IndexOutOfBoundsException(String.format(
            "writerIndex(%d) + minWritableBytes(%d) exceeds maxCapacity(%d): %s",
            writerIndex, minWritableBytes, maxCapacity, this));
}

3.解决方案

无法扩容,只能重新赋值了,这里msg用了replace的函数。

ByteBuf newBuffer = ByteBufAllocator.DEFAULT.heapBuffer(newBytes.length);
newBuffer.writeBytes(newBytes);
msg = msg.replace(newBuffer);  

最后如果想彻底改变MqttPublishMessage的话,还需赋值成final,以解决lambda表达式报错问题

final MqttPublishMessage msgDecoded = DecodeService.decode(msg);

总结

maxCapacity无法改变,只能重新赋值,如有不对之处,还请大侠指点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

F_angT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值