================
package 新型IO;
import java.nio.ByteBuffer;
public class _001_NIO简介
{
public static void main(String[] args)
{
My_Buffer my_Buffer1=new My_Buffer();
my_Buffer1.allocateBuffer();
}
}
class My_Buffer
{
// mark //标记(尚不明确)
// capacity //容量
// limt //限制,第一个不能读写的元素的索引 如果是5,那么0-4都可以,5开始不行
// position //位置,读写下一个元素的索引
// remain //剩余 remain= limit -position
// 0<=mark<=Position<=limit<=capacity
// rewind //pos=0 mark丢弃,重绕
// clear //pos=0 lim=cap mark丢弃 只有pos=0,limt到最大,才能清除所有
// flip //lim=pos pos=0 mark丢弃,只有lim=pos,pos=0,要写入数据到其他地方,从buff读的时候
// //肯定要重头读,所以要pos=0,lim=pos是固定,因为pos后面都先不需要了
// reset //pos=mark,需要先使用mark标志下位置
// slice //切片,从当前缓冲区中划出前N个元素构造新缓冲区,n等于当前buffer的remaining大小
// //2个buffer操纵同一byte[] 但有各自的属性,pos limit等
public void allocateBuffer()
{
ByteBuffer buffer=ByteBuffer.allocate(10);//ByteBuffer.allocateDirect()是直接分配物理内存
//allocate分配到虚拟机中
System.out.println("mark:"+buffer.mark()); //pos=0 lim=10 cap=10 显示这3个属性
System.out.println("position:"+buffer.position());
System.out.println("limit:"+buffer.limit());
System.out.println("capacity:"+buffer.capacity());
System.out.println("remainning:"+buffer.remaining());
buffer.put((byte)1);
buffer.put((byte)2);
buffer.put((byte)3);
buffer.put((byte)4);
System.out.println("position:"+buffer.position());
System.out.println("limit:"+buffer.limit());
System.out.println("capacity:"+buffer.capacity());
System.out.println("remainning:"+buffer.remaining());
buffer.flip();
System.out.println(buffer.get()); //不加参数的get会根据当前索引继续读(前面都不是索引操作,现在索引为0),所以如果用无参的get,需要用flip先
System.out.println(buffer.get()); //如果指定了索引那就不用了
System.out.println(buffer.get());
System.out.println(buffer.get());
// System.out.println(buffer.get()); //因为limit会等于pos,所以固定了读取的长度,指针继续下移读取会出错
}
}