Netty 快速入门系列 - Chapter 6 自定义数据协议【第十四讲】ByteBuffer 和 ChannelBuffers

本文通过示例代码展示了ByteBuffer和ChannelBuffer两种序列化方式的区别。ByteBuffer在分配内存时需要预先设定容量且不可扩容,而ChannelBuffer则支持动态扩容。文章通过具体的Java代码实例演示了这两种缓冲区的操作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ByteBuffer: 通过ByteBuffer 完成数据序列化,但是ByteBuffer.allocate(N) 必须提前设置ByteBuffer容量,无法扩容

public static void main(String[] args) throws IOException {


		int id = 123456789;
		int age = 21;

		//无法扩容
		ByteBuffer buffer = ByteBuffer.allocate(4+4+8);
		buffer.putInt(id);
		buffer.putInt(age);
		buffer.putLong(1);
		
		System.out.println(Arrays.toString(buffer.array()));


		buffer = ByteBuffer.wrap(buffer.array());


		System.out.println(buffer.getInt());
		System.out.println(buffer.getInt());
		System.out.println(buffer.getLong());


	}



ChannelBuffer:通过ChannelBuffer完成数据序列化,可以自动扩容ChannelBuffers.dynamicBuffer()

public static void main(String[] args) throws IOException {


     int id = 123456789;
     double money = 100.05;


     // 无法扩容
     ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
     buffer.writeInt(id);
     buffer.writeDouble(money);
     buffer.writeLong(1);


     buffer.writeShort("ABC".getBytes().length);
     buffer.writeBytes("ABC".getBytes());

     byte[] bytes = new byte[buffer.writerIndex()];
     buffer.readBytes(bytes);

     System.out.println(Arrays.toString(bytes));


     // ------------------------------------------


     buffer = ChannelBuffers.wrappedBuffer(bytes);

     System.out.println(buffer.readInt());
     System.out.println(buffer.readDouble());
     System.out.println(buffer.readLong());

     byte[] value = new byte[buffer.readShort()];
     buffer.readBytes(value);

     System.out.println(new String(value));

  }

所有源码下载 :https://download.youkuaiyun.com/download/netcobol/10308871
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值