网络上发送数据并不是直接字符串形式,而是将其转为ByteBuffer,然后ByteBuffer写到Channel
第一种
//1.把字符串转为ByteBuffer
ByteBuffer buffer = ByteBuffer.allocate(16);
buffer.put("hello".getBytes());
debugAll(buffer);//可使用其他的打印方式,比如buffer.get();
/*
+--------+-------------------- all ------------------------+----------------+
position: [5], limit: [16]
+-------------------------------------------------+
| 0 1 2 3 4 5 6 7 8 9 a b c d e f |
+--------+-------------------------------------------------+----------------+
|00000000| 68 65 6c 6c 6f 00 00 00 00 00 00 00 00 00 00 00 |hello...........|
+--------+-------------------------------------------------+----------------+
*/
第二种
//2. Charset(字符集)
//Charset.defaultCharset();操作系统默认的字符集
ByteBuffer buffer = StandardCharsets.UTF_8.encode("hello");
debugAll(buffer);
//和第一种不同的是,这个会自动切换为读模式,对比position就知道了
/*
+--------+-------------------- all ------------------------+----------------+
position: [0], limit: [5]
+-------------------------------------------------+
| 0 1 2 3 4 5 6 7 8 9 a b c d e f |
+--------+-------------------------------------------------+----------------+
|00000000| 68 65 6c 6c 6f |hello |
+--------+-------------------------------------------------+----------------+
*/
第三种
//3.wrap,和第二种结果是一样的
ByteBuffer buffer = ByteBuffer.wrap("hello".getBytes());
debugAll(buffer);
//buffer转字符串
String str1 = StandardCharsets.UTF_8.decode(buffer).toString();
System.out.println(str1);
//注意,只有第二第三种可以这么decode,因为第一种还没有切换到读模式,什么也读不到,可以先调用buffer.flip();切换成读模式再sout