io:面向流 ,阻塞IO(Blocking IO) NIO:面向缓冲区,非阻塞IO(Non Blocking IO,选择器(Selectors)
1:缓冲区(buffer):java NIO负责数据的存取。缓冲区就是数组,用于存储不同数据类型的数据,根据类型不同提供了不同的缓冲区例如:ByteBuffer,CharBuffer,ShortBuffer,IntBuffer等。通过allocate()方法分配一个具有指定大小的底层数组
ByteBuffer buff=ByteBuffer.allocate(1024);
2:缓冲区核心属性:
capacity:容量,表示缓冲区的最大存储数据的容量
limit:界限,表示缓冲区中可以操作数据的大小,limit后数据不能进行读写
position :位置,表示缓冲区中正在操作数据的位置
mark:记录当前position的位置 可以通过reset()恢复到mark位置 0<=mark<=position<limit<capacity
4:非直接缓冲区:通过allocate()方法分配缓冲区 将缓冲区建立在JVM内存中
非直接缓冲区:通过allocateDirect()方法分配缓冲区 将缓冲区建立在物理内存中。
5:缓冲区是通过channel(通道)来进行传输的 通道channel 是用于源节点与目标节点的连接 在java NIO中负责缓冲区中数据的传输 。channel本身不存储数据 需配合缓冲区进行传输
6:阻塞与非阻塞
传统的IO流都是阻塞式的。当一个线程调用read()或write()时 该线程阻塞 直到有一些数据被读取或写入 该线程在此期间不能执行其他任务。NIO是非阻塞的,当线程从某通道进行读写数据时,若没有数据可用时 可以进行其他任务。线程通常将非阻塞IO的空闲时间用于在其他通道上执行IO操作 单独的现程可以管理多个输入或输出通道。 NIO可以让服务器端使用一个或有限几个线程来同时处理连接到服务器的所有客户端
7:
选择器(selectors)
选择器是SelectorChannel对象的多路复用器,selector可使一个单独的线程管理多个Channel ,selector是 非阻塞IO的核心,使用单个线程来处理多个Channel相对于多线程处理多通道,节省了开辟新线程和不同线程之间切换的开销