public static void main(String[] args) {
ByteBuffer byteBuffer = ByteBuffer.allocate(10);// 划分一块内存做缓冲区
/*
看构造过程,可以知道是
以10构建一个byte[]
当然考虑了字节序 boolean bigEndian
而所有的切换clear rewind mark等等,都是基于index
将position等等,修改,看调用函数的测试案例并无意义,直接看源码就知道了
*/
{ // 才申请的 byteBuffer的limit = 10,说明默认是写模式,毕竟没有数据,读不出来
System.out.println("--------------------------");
System.out.println("now-limit:" + byteBuffer.limit());
System.out.println("now-positon:" + byteBuffer.position());
}
{ // 切换读,limit就是0了
byteBuffer.flip();
System.out.println("--------------------------");
System.out.println("now-limit:" + byteBuffer.limit());
System.out.println("now-positon:" + byteBuffer.position());
}
{ // 写三个数据进去
byteBuffer.clear();
System.out.println("--------------------------");
System.out.println("now-limit:" + byteBuffer.limit());
System.out.println("now-positon:" + byteBuffer.position());
byteBuffer.put((byte)1);
byteBuffer.put((byte)2);
byteBuffer.put((byte)3);
System.out.println("--------------------------");
System.out.println("now-limit:" + byteBuffer.limit());
System.out.println("now-positon:" + byteBuffer.position());
}
{ // 读走一个数据
byteBuffer.flip();
System.out.println("--------------------------");
System.out.println("now-limit:" + byteBuffer.limit());
System.out.println("now-positon:" + byteBuffer.position());
System.out.println("--------------------------");
System.out.println("read:"+byteBuffer.get());
System.out.println("now-limit:" + byteBuffer.limit());
System.out.println("now-positon:" + byteBuffer.position());
}
{ // compact之后,果然position为 3-1=2,且为写模式u
byteBuffer.compact();
System.out.println("--------------------------");
System.out.println("now-limit:" + byteBuffer.limit());
System.out.println("now-positon:" + byteBuffer.position());
}
{ // clear之后,从头开始写,但是数据还在
// array 操作不会取走数据,或者说,get也不会取走数据,只是改了下标position,get(i)甚至不会改 position
// 除了compact会真的修改到数据
byteBuffer.clear();
System.out.println("--------------------------");
System.out.println("now-limit:" + byteBuffer.limit());
System.out.println("now-positon:" + byteBuffer.position());
System.out.println(Arrays.toString(byteBuffer.array()));
System.out.println("--------------------------");
System.out.println("now-limit:" + byteBuffer.limit());
System.out.println("now-positon:" + byteBuffer.position());
System.out.println(Arrays.toString(byteBuffer.array()));
}
}
public static void main(String[] args) {
// 居然有这种转换,为什么?
ByteBuffer byteBuffer = StandardCharsets.UTF_8.encode("哈");
// jdk 开发者认为 字到字节是encode的过程,这个可以理解
// 但是 为什么结果是byteBuffer,更加通常的应该是一个 byte[]
// 是因为String.getBytes已经提供了此功能么,总感觉底层逻辑有混乱
// 这不符合直觉
{ // 这种创建的buffer是读模式的,而不是写
System.out.println("--------------------------");
System.out.println("now-limit:" + byteBuffer.limit());
System.out.println("now-positon:" + byteBuffer.position());
}
ByteBuffer byteBuffer2 = ByteBuffer.wrap("123".getBytes());//wrap-->包裹
{ // 这种创建的buffer是读模式的,而不是写, 或者说,创建时给了数据,就默认读,没给数据,就默认写
System.out.println("--------------------------");
System.out.println("now-limit:" + byteBuffer2.limit());
System.out.println("now-positon:" + byteBuffer2.position());
}
}