网络编程-03丨Java NIO基础

Posted by jiefang on June 11, 2020

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多路复用:

  1. 把通道注册到选择器中;
  2. 选择器可以查询这些注册的通道是否有已经就绪的IO事件(包括可读可写网络连接完成等);

缓冲区(Buffer)

应用程序与通道(Channel)主要的交互操作,就是进行数据的read读取和write写入。NIO 使用Buffer(缓冲区)作为数据暂时存储的地方。

  • 通道的读取,就是将数据从通道读取到缓冲区中;
  • 通道的写入,就是将数据从缓冲区中写入到通道中。