1. 程式人生 > >Chapter 6 自定義資料協議【第十四講】ByteBuffer 和 ChannelBuffers

Chapter 6 自定義資料協議【第十四講】ByteBuffer 和 ChannelBuffers

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.csdn.net/download/netcobol/10308871