在Java中,NIO读写是I/O的基本过程。 从通道读取:创建一个缓冲区,然后请求通道读取数据。通道写入:创建一个缓冲区,填充数据,并要求通道写入数据。
读写操作中使用的核心部件有:

  • Channels
  • Buffers
  • Selectors

Java NIO还有其它更多的组件和类,但是Channel,Buffer和Selector用作API的核心。

通道和缓冲区

在标准I/O API中,使用字符流和字节流。 在NIO中使用通道和缓冲区。 NIO中的所有I/O都是通过一个通道开始的。数据总是从缓冲区写入通道,并从通道读取到缓冲区。
数据读取操作:
下面来看看将数据从通道读入缓冲区,如下图所示:
Java NIO组件 - 图1
数据写入操作:
下面来看看从缓冲区将数据写入通道,如下图所示:
Java NIO组件 - 图2

通道列表

在Java NIO中,主要使用的通道如下:

  • DatagramChannel(UDP)
  • SocketChannel 和 ServerSocketChannel(TCP的C端和S端)
  • FileChannel(文件IO)

上述通道涵盖UDP(用户数据报协议)+ TCP(传输控制协议)网络I/O和文件I/O。

缓冲列表

在Java NIO中使用的核心缓冲区如下:

  • CharBuffer
  • DoubleBuffer
  • IntBuffer
  • LongBuffer
  • ByteBuffer
  • ShortBuffer
  • FloatBuffer

上述缓冲区覆盖了通过I/O发送的基本数据类型:characters,double,int,long,byte,short和float。

选择器

Java NIO提供了“选择器”的概念。这是一个可以用于监视多个通道的对象,如数据到达,连接打开等。因此,单线程可以监视多个通道中的数据。
如果应用程序有多个通道(连接)打开,但每个连接的流量都很低,则可考虑使用它。 例如:在聊天服务器中。
下面来看看线程使用选择器来处理3个通道,如下图所示:
Java NIO组件 - 图3