Java NIO

NIO: 同步非阻塞,面向缓冲区,基于通道的io操作。

首先了解阻塞和非阻塞,同步和异步的概念

阻塞和非阻塞(基于进程):

阻塞:调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回

非阻塞:指在不能立刻得到结果之前,该调用不会阻塞当前线程。

同步和异步(基于应用程序):

同步:主动请求并等待I/O操作完毕

异步:主动请求数据后,便可以继续处理其它任务,随后等待I/O,操作完毕的通知

NIO三大核心部分:Buffer(缓冲区) 、Channel(通道) 、Selector(选择器)

它们之间的关系:

  Java NIO

Buffer(缓冲区) : 一个可读写数据的内存块,可以理解成一个容器对象(含数组),该对象提供了一组方法,可以更轻松使用内存块

常用Buffer子类一览

ByteBuffer,存储字节数据到缓冲区

ShortBuffer,存储字符串数据到缓冲区

CharBuffer,存储字符数据到缓冲区

IntBuffer,存储整数数据到缓冲区

LongBuffer,存储长整型数据到缓冲区

DoubleBuffer存储小数到缓冲区 FloatBuffer,存储小数到缓冲区

Buffer类定义了所有的缓冲区都具有的四个属性来提供关于其所包含的数据元素的信息

Capacity:容量,即可以容纳的最大数据量;在缓冲区创建时被设定并且不能改变

Limit:表示缓冲区的当前终点,不能对缓冲区超过极限的位置进行读写操作。且极限是可以修改的

Position:位置,下一个要被读或写的元素的索引,每次读写缓冲区数据时都会改变改值,为下次读写作准备

Mark:标记

 

Channel(通道): NIO的通道类型于流,但通道可以同时读写,流只能读或者只能写

Selector(选择器): 检测多个注册的通道上是否有事件发生

NIO与BIO对比:

面向缓冲与面向流

IO是面向流的.NIO是面向缓冲区的。Java IO面向流意味着毎次从流中读一个成多个字节,直至读取所有字节,它们没有被缓存在任何地方,此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的教据,需要先将它缓存到一个缓冲区。Java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,霱要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数裾。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据

NIO:一个线程管理多个连接
BIO:一个线程管理一个连接