ByteBuffer是NIO里用得最多的Buffer,它包含两个实现方式:HeapByteBuffer
是基于Java堆的实现,而DirectByteBuffer
则使用了unsafe
的API进行了堆外的实现。
ByteBuffer的常用参数和方法:
Capacity:容量 。初始化的容量,一旦确定不能更改。如果插入的数据大于容量会出现java.nio.BufferOverflowException
Position:当前位置
Mark:对当前位置坐标记,可以根据需要再次指向这个位置
Limit: 读写的上限。在写时 limit = capacity ,在读时 limit = 写入字符的最大长度。
Put : 向ByteBuffer写入数据。
Get:读ByteBuffer中的数据。
Filp : 一般写完数据时,要调用其方法,准备开始读取数据,这时position 变成0 ,limit 变成ButeBuffer 的字节长度,capactity 不变。
Clear: 把postion 变成0 单里面的数据并不清空。
ByteBuffer buf = ByteBuffer.allocate(1024);
System.out.println("--存入数据前--");
System.out.println("limit:"+buf.limit());
System.out.println("position:"+buf.position());
System.out.println("capacity:"+buf.capacity());
buf.put("abcdefg".getBytes());
System.out.println("--存入数据后--");
System.out.println("limit:"+buf.limit());
System.out.println("position:"+buf.position());
System.out.println("capacity:"+buf.capacity());
buf.flip();
System.out.println("--调用flip()方法后--");
System.out.println("position:"+buf.position());
System.out.println("limit:"+buf.limit());
System.out.println("capacity:"+buf.capacity());
byte[] b = newbyte[buf.limit()]; //如果读取时长度大于limit 会抛出异常
buf.get(b);
System.out.println("--读取玩数据后--");
System.out.println("--调用flip()方法后--");
System.out.println("position:"+buf.position());
System.out.println("limit:"+buf.limit());
System.out.println("capacity:"+buf.capacity());
打印结果:
--存入数据前--
limit:1024
position:0
capacity:1024
--存入数据后--
limit:1024
position:7
capacity:1024
--调用flip()方法后--
position:0
limit:7
capacity:1024
--读取玩数据后--
--调用flip()方法后--
position:7
limit:7
capacity:1024
测试clear 方法
ByteBuffer buf = ByteBuffer.allocate(1024);
buf.flip();
buf.clear();
System.out.println("--调用flip()clear--");
System.out.println("position:"+buf.position());
System.out.println("limit:"+buf.limit());
System.out.println("capacity:"+buf.capacity());
System.out.println("差距"+ buf.remaining());
buf.put("ab".getBytes());
System.out.println("差距"+ buf.remaining());
byte[] cb = newbyte[10]; //如果读取时长度大于limit 会抛出异常
buf.get(cb);
System.err.println("数据"+new String(cb));//clear 只是把数据遗忘依然可以获取值单 position 的位置变成了12 每读一位数据 position 就会移动一位
buf.put("ef".getBytes());
buf.flip();
System.out.println("差距"+ buf.remaining());
byte[] b = newbyte[buf.limit()]; //如果读取时长度大于limit 会抛出异常
buf.get(b);
System.err.println("数据"+new String(b));
System.out.println("--调用flip()clear--");
System.out.println("position:"+buf.position());
System.out.println("limit:"+buf.limit());
System.out.println("capacity:"+buf.capacity());
打印结果:
--调用flip()clear--
position:0
limit:1024
capacity:1024
差距1024
差距1022
数据cdefg