package NIOTest;
import java.nio.ByteBuffer;
/**
* 一:缓冲区(buffer),在java nio中用于负责数据的存储
* ,缓冲区就是数组,用于存储不同类型的数据
* 根据数据类型的不同,提供了相应类型的缓冲区(boolean除外)
*
*/
public class NIO {
/**
* 缓冲区的核心方法
* put()放
* get()取
* @param args
*
* 缓冲区的四个核心数形
* capacity:容量,表示缓冲区最大的存储容量,一旦声明不得改变
* limit:界限,表示缓冲区可以操作的数据大小,(limit后的数据不进行读写)
* position:位置,表示缓冲区正在操作的数据的位置
* position<=limit<=capacity
* mark:标记,表示记录当前position的位置,可以通过reset恢复到mark的位置
*/
public static void main(String[] args) {
test2();
}
public static void test1() {
//缓冲区的大小
ByteBuffer buf=ByteBuffer.allocate(1024);
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
//利用put方法存数据到缓冲区
String str="i love you";
buf.put(str.getBytes());
System.out.println("存放数据position"+buf.position());
//切换到读数据模式flip()
buf.flip();
System.out.println("flip之后position:"+buf.position());
System.out.println("limit:"+buf.limit());
System.out.println("capactity:"+buf.capacity());
//利用get读取数据
byte[] b=new byte[buf.limit()];
buf.get(b);//读取数据存放到b字节数据中
System.out.println(new String(b));
System.out.println("=========读取之后===========");
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
//rewind()方法 可重复读数据
System.out.println("==========rewind之后===========");
buf.rewind();
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
byte[] bb=new byte[buf.limit()];
buf.get(bb);
System.out.println(new String(bb));
//clear清空缓冲区,但是缓冲区中数据依然存在,但是出于被遗忘
buf.clear();
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
}
public static void test2() {
ByteBuffer buf=ByteBuffer.allocate(1024);
buf.put("iloveyou".getBytes());
buf.flip();
byte[] b=new byte[buf.limit()];
buf.get(b,0,2);
System.out.println(new String(b));
System.err.println("读取之后的postion:"+buf.position());
//mark标记
buf.mark();
buf.get(b,2,2);
System.out.println(new String(b,2,2));
System.out.println(buf.position());
buf.reset();
System.out.println(buf.position());
if(buf.hasRemaining()) {//是否还有可读取的数据
System.out.println(buf.remaining());//可操作的还剩几个?
}
}
public static void test3() {
/**
* 直接缓冲区和非直接缓冲区
* 非直接缓冲区:通过allocate()方法分配缓冲区,将缓冲区建立在jvm中使用
*直接缓冲区:通过allocateDirect()方法直接分配缓冲区,将缓冲区建立在物理内存中,可以提高效率
*/
}
}