package com.sico.pck01_nio;
import java.nio.ByteBuffer;
import org.junit.Test;
/**
* @author Sico
* 1、NIO入门:三个核心概念如下:
* |--通道:连接作用,连接数据源和目标地
* |--缓冲区:用于存取数据
* |--选择器:
*
* 2、NIO与IO的区别:
* |--IO面向流,NIO面向缓冲区
* |--IO阻塞,NIO非阻塞
* |--
* 3、(1)缓冲区:负责数据的存取,底层数组(用于存取不同类型的数据),根据类型的不同有相应类型的缓冲区(boolean除外):ByteBuffer,CharBuffer,LongBuffer,IntBuffer,FloatBuffer,
* DoubleBuffer,ShortBuffer===》》》以上缓冲区的管理方式类似,都是通过allocate换区缓冲区。最常用为ByteBuffer缓冲区
* (2)缓冲区中存取数据的两个核心方法,put存,get取
* (3)缓冲区中的核心属性
* |--mark:记录当前position的位置,通过reset回复到mark记录的位置
|--position:缓冲区中正在数据的位置
|--limit:缓冲区中可以操作数据的大小,limit后面的数据无法操作
|--capacity:缓冲区的最大容量,一旦声明不允许改变,原因:底层是数组,数组大小声明后不允许更改
规律:mark<=position<=limit<=capacity
*
*/
public class Nio01 {
@Test
public void fun02(){
ByteBuffer buf = ByteBuffer.allocate(1024);
buf.put("abcde".getBytes());
printProperty(buf);
print("******************************");
buf.flip();
byte[] dst=new byte[buf.limit()];
buf.get(dst, 0, 2);
print("获取到的数据:"+new String(dst));
buf.mark();
printProperty(buf);
print("******************************");
buf.get(dst, 2, 2);
print("获取的数据:"+new String(dst));
printProperty(buf);
print("******************************");
buf.reset();
printProperty(buf);
//判断缓冲区中是否还有数据
if(buf.hasRemaining()){
print("缓冲区中还可以获取的字节数:"+buf.remaining());
}
}
@Test
public void fun01(){
//1、获取指定大小的缓冲区
ByteBuffer buf = ByteBuffer.allocate(1024);
printProperty(buf);
print("******************************");
//2、put存取数据,写模式
buf.put("abcde".getBytes());
printProperty(buf);
//3、切换模式
buf.flip();
print("******************************");
//4、读模式
printProperty(buf);
byte[] dst=new byte[buf.limit()];
buf.get(dst);
print("获取到的数据:"+new String(dst));
print("******************************");
printProperty(buf);
//5、rewind();可重复读取数据
buf.rewind();
print("******************************");
printProperty(buf);
//6、清空缓冲区clear,但是缓冲区中的数据依然存在,处于被遗忘的状态
buf.clear();
print("依然有数据:"+(char)buf.get());
print("******************************");
printProperty(buf);
}
public void printProperty(ByteBuffer buf){
print("position:"+buf.position());
print("limit:"+buf.limit());
print("capacity:"+buf.capacity());
}
public void print(Object o){
System.out.println(o);
}
}
原文地址:https://www.cnblogs.com/sico/p/10386464.html