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()); } }