package com.xbb.demo;
import org.junit.Test;
import java.nio.Buffer;
import java.nio.ByteBuffer;
/**
* 一 : 缓冲区(Buffer):在Java NIO中负责数据的存取.缓冲区就是数组.用于存储不同数据类型的数据
*
* 根据数据类型的不同(boolean除外),提供了相应类型的缓冲区
*
* ByteBuffer
* charBuffer
* ShortBuffer
* IntBuffer
* LongBuffer
* FloatBuffer
* DoubleBuffer
*
* 这些缓冲区的管理方式基本上都是相同的.通过allocate()获取缓冲区
*
* 二 : 缓冲区存取数据的两个核心方法
* put() : 存入数据到缓冲区
* get() : 从缓冲区获取数据
*
* 三 : 缓冲区中的四个核心属性
* position <= limit <= capacity
* // 标记,表示记录当前position的位置.可以通过reset()恢复到mark的位置
* private int mark = -1;
* // 位置 : 表示缓冲区中正在操作数据的位置.
* private int position = 0;
* // 界限 : 表示缓冲区可以操作数据的大小.(Limit后数据不能进行读写)
* private int limit;
* // 容量 : 表示缓冲区中最大存储数据的容量.一旦声明不能改变
* private int capacity;
*/
public class BufferDemo {
/**
* 普通操作
*/
@Test
public void test1(){
// 分配一个指定大小的缓冲区
ByteBuffer buf = ByteBuffer.allocate(1024);
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
System.out.println("----------put()--------------" );
// 把数据存入缓冲区
buf.put("abc".getBytes());
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
// 把数据取出来
// flip 切换到读数据模式
buf.flip();
System.out.println("-----------get()-------------" );
// 把数据存入缓冲区
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
byte[] dst = new byte[buf.limit()];
buf.get(dst,0,buf.limit());
System.out.println(new String(dst));
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
System.out.println("----------rewind()--------------" );
// rewind() 指针回到起点位置,可以重复读取数据
buf.rewind();
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
System.out.println("----------clear()--------------" );
// clear() 恢复到最初状态,但是数据还是在的
buf.clear();
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
}
@Test
public void test2(){
String str = "abcde";
ByteBuffer buf = ByteBuffer.allocate(1024);
buf.put(str.getBytes());
Buffer mark = buf.mark();
System.out.println(buf.position());
System.out.println(buf.limit());
System.out.println(buf.capacity());
buf.flip();
byte[] bytes = new byte[buf.limit()];
buf.get(bytes,0,2);
System.out.println(new String(bytes));
System.out.println("----------get()--------------" );
System.out.println(buf.position());
buf.get(bytes,2,2);
buf.mark();
System.out.println(new String(bytes));
System.out.println("----------get()--------------" );
System.out.println(buf.position());
System.out.println("----------clear()--------------" );
System.out.println(buf.position());
buf.reset();
System.out.println(buf.position());
}
/**
* 判断缓冲区是否还有可操作的数据
*/
@Test
public void hasRemain(){
String str = "abcdefg";
ByteBuffer buf = ByteBuffer.allocate(1024);
buf.put(str.getBytes());
buf.flip();
while (buf.hasRemaining()){
System.out.println("还有 " + buf.remaining() + " 个");
System.out.println((char) buf.get());
}
}
}