最近学习一下Java NIO非阻塞式IO,下面是NIO中几个重要的属性和方法,方便大家理解
/**
* nio 非阻塞IO
* nio核心 Channel,Buffer 和 Selector
*
* 1.缓冲区buffer:在nio中负责数据的存取,缓冲区就是数据,用于存储不同的数据类型
*
* 数据类型不同(boolean除外),提供对应的缓冲区,其实就是数组
* ByteBuffer
* CharBuffer
* ShortBuffer
* IntBuffer
* LongBuffer
* FloatBuffer
* DoubleBuffer
*
* 都是通过allocate()获取缓冲区
*
* 2.缓冲区中连个重要方法
* put():存入数据导缓冲区
* get():从缓冲区获取数据
*
* 3.缓冲区中四个属性
* capacity:容量,表示缓冲区最大存储数据的容量,一旦创建不能改变
* limit:界限,表示缓冲区中可以操作数据的大小。写模式下,limit等于Buffer的capacity,当切换Buffer到读模式时, limit表示你最多能读到多少数据
* position:位置,表示缓冲区中正在操作数据的位置。从0开始
* mark:标记,记录当前position的位置,可以通过reset()恢复到mark的位置。
*
* 0<=mark<=position<=limit<=capacity
*
*/
public class NioParam {
@Test
public void positionLimitCapacity() {
ByteBuffer buf = ByteBuffer.allocate(1024);
System.out.println("-----------allocate初始大小-------");
System.out.println("capacity="+buf.capacity());
System.out.println("limit="+buf.limit());
System.out.println("position="+buf.position());
//利用put写入数据
System.out.println("-----------put-------");
String src = "abcde";
buf.put(src.getBytes());
System.out.println("capacity="+buf.capacity());
System.out.println("limit="+buf.limit());
System.out.println("position="+buf.position());
//flip切换读取模式
System.out.println("-----------flip-------");
buf.flip();
System.out.println("capacity="+buf.capacity());
System.out.println("limit="+buf.limit());
System.out.println("position="+buf.position());
//get读取缓冲区的数据
System.out.println("-----------get-------");
byte[] dst = new byte[buf.limit()];
buf.get(dst);
System.out.println(new String(dst,0,dst.length));
System.out.println("capacity="+buf.capacity());
System.out.println("limit="+buf.limit());
System.out.println("position="+buf.position());
//rewind重复读
System.out.println("-----------rewind-------");
buf.rewind();
System.out.println("capacity="+buf.capacity());
System.out.println("limit="+buf.limit());
System.out.println("position="+buf.position());
//clear清空缓冲区
System.out.println("-----------clear-------");
buf.clear();
System.out.println("capacity="+buf.capacity());
System.out.println("limit="+buf.limit());
System.out.println("position="+buf.position());
//但是缓冲区中的数据还存在,但是出于“被遗忘”状态
// System.out.println((char)buf.get());
}
@Test
public void mark() {
ByteBuffer buf = ByteBuffer.allocate(1024);
String str = "abcde";
buf.put(str.getBytes());
buf.flip();
byte[] dst = new byte[buf.limit()];
buf.get(dst, 0, 2);
System.out.println(new String(dst));
System.out.println(buf.position());
//mark标记
buf.mark();
buf.get(dst, 2, 2);
System.out.println(new String(dst));
System.out.println(buf.position());
//reset恢复到mark的位置
buf.reset();
System.out.println(buf.position());
//判断缓冲区中是否还有可操作的数据
if (buf.hasRemaining()) {
//看看还有多少剩余数据
System.out.println(buf.remaining());
}
}
}
运行效果: