Java NIO基础
NIO简介
在1.4版本之前,Java IO类库是阻塞IO;从1.4版本开始,引进了新的异步IO库,被称为Java New IO类库,简称为JAVA NIO。Java NIO,属于第三种模型——IO多路复用模型。 Java NIO由以下三个核心组件组成:
- Channel(通道)
- Buffer(缓冲区)
- Selector(选择器)
NIO与BIO对比
Java中NIO与BIO区别,主要体现在三方面:
- BIO是面向流(Stream Oriented)的,NIO是面向缓冲区(Buffer Oriented)的。
- BIO是面向字节流或字符流的,在一般的BIO操作中,以流式的方式顺序地从一个流(Stream)中读取一个或多个字节,不能随意地改变读取指针的位置;
- NIO操作中则不同,NIO中引入了Channel(通道)和Buffer(缓冲区)的概念。读取和写入,只需要从通道中读取数据到缓冲区中,或将数据从缓冲区中写入到通道中。NIO可以随意地读取Buffer中任意位置的数据。
- BIO的操作是阻塞的,而NIO的操作是非阻塞的。
- BIO没有选择器(Selector)概念,而NIO有选择器的概念。
通道(Channel)
- BIO中,同一个网络连接会关联到两个流:一个输入流(Input Stream),另一个输出流(Output Stream)。通过这两个流,不断地进行输入和输出的操作。
- NIO中,同一个网络连接使用一个通道表示,所有的NIO的IO操作都是从通道开始的。一个通道类似于BIO中的两个流的结合体,既可以从通道读取,也可以向通道写入。
选择器(Selector)
什么是IO多路复用?指的是一个进程/线程可以同时监视多个文件描述符(一个网络连接,操作系统底层使用一个文件描述符来表示),一旦其中的一个或者多个文件描述符可读或者可写,系统内核就通知该进程/线程。在Java应用层面,如何实现对多个文件描述符的监视呢?需要用到一个非常重要的Java NIO组件——Selector选择器。 通过选择器,一个线程可以查询多个通道的IO事件的就绪状态,实现IO多路复用:
- 把通道注册到选择器中;
- 选择器可以查询这些注册的通道是否有已经就绪的IO事件(包括可读、可写、网络连接完成等);
缓冲区(Buffer)
应用程序与通道(Channel)主要的交互操作,就是进行数据的read读取和write写入。NIO 使用Buffer(缓冲区)作为数据暂时存储的地方。
- 通道的读取,就是将数据从通道读取到缓冲区中;
- 通道的写入,就是将数据从缓冲区中写入到通道中。