Java NIO基本介绍
- Java NIO 是java1.4版本引入的新的IOAPI,可以替代标准的java IO API .NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的,基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。NIO可以理解为非阻塞IO,传统的IO的read和write只能阻塞执行,线程在读写IO期间不能干其他事情,比如调用socket.read()时,如果一直没有数据传过来,线程就会一直阻塞,而NIO可以配置socket为非阻塞模式。
- NIO相关类都被放在Java,nio包及子包下,并且对原Java,io包中的很多类进行改写。
- NIO三大核心部分 Channel(通道),Buffer(缓冲区),Selector(选择器)
- JavaNIO的非阻塞模式,使一个线程从某通道发送请求或者读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取,而不是保持线程阻塞,所以直至数据变得可以读取之前,该线程可以继续做其他的事情,非阻塞写也是如此,一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程可以去做别的事情。
- 通俗理解,NIO是可以做到用一个线程来处理多个操作的。假设有1000个请求过来,根据实际情况,可以分配20或者80个线程来处理。不像之前的阻塞IO那样,非得分配1000个
NIO三大核心原理
NIO有三大核心部分Channel(通道)、Buffer(缓冲区)、Selector(选择器)
Buffer缓冲区
缓冲区本质上是一块可以写入数据,也可以从中读取数据的内存,这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问这块内存。相比直接对数组的操作,Buffer API更加容易操作和管理
Channel(通道)
Java NIO的通道类似流,但又有所不同,既可以从通道中读取数据,又可以写数据到通道,单流的读写通常是单向的,通道可以非阻塞读取和写入融到,通道可以支持读取或写入缓冲区,也支持异步地读写。
Selector选择器
Selector是一个JavaNIO组件,可以能够检查一个或多个NIO通道,并确定哪组通道已经准备好进行读取或写入,这样一个单独的线程可以管理多个Channel,从而管理多个网络连接,提高效率
- 每个Channel都会对应一个Buffer
- 一个线程对应Selector ,一个Selector对应多个Channel
- 程序切换到那个Channel是由事件决定的
- Selector会根据不同的事件,在各个通道上切换
- Buffer是一个内存块,底层是一个数组
- 数据的读取写入是通过Buffer完成的BIO中要么是输入流要么是输出流,不能双向,但是NIO的Buffer既可以是读也可以写