Skip to content

Latest commit

 

History

History
50 lines (33 loc) · 2.23 KB

File metadata and controls

50 lines (33 loc) · 2.23 KB

#02.Java NIO概览

Java NIO包括以下核心组件:

  • 通道(Channels)
  • 缓冲区(Buffers)
  • 选择器(Selectors)

Java NIO包含许多类和组件,但是通道(Channels),**缓冲区(Buffers)选择器(Selectors)是其中最核心的接口。其他的组件,例如管道(Pipe)和文件锁(FileLock)**只是为这三个核心组件服务的工具类。

##通道和缓冲区(Channels and Buffers)

通常情况下,在NIO中的所有IO都起始于通道(Channels)。通道有点类似于。来自通道的数据可以读取到缓冲区中,同样地,也可以从缓存区中写入数据到通道,如下图所示:

Java NIO: Channels read data into Buffers, and Buffers write data into Channels

Java NIO中有很多Channel和Buffer实现。以下是Java NIO中最主要的Channel的实现类;

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

正如你所见,这些通道覆盖了UDP、TCP和文件IO。

以下是Java NIO中最主要的Buffer的实现类:

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

以上的缓冲区实现类覆盖了你能通过IO发送的全部基本类型数据数据。Java NIO也提供了一个叫MappedByteBuffer的Buffer实现类,它用于跟内存映射文件交互。

##选择器(Selectors)

选择器允许使用一个线程来操作多个通道。这对于那些有大量网络连接但传输的数据量非常少的应用来说是非常方便有利的,例如聊天服务器。

下面的示图描述了一个线程使用选择器来处理三个通道:

A Thread uses a Selector to handle 3 Channel's

当你需要使用选择器时,你需要使用它向通道进行注册(register)。然后调用选择器的select()方法。这个方法会阻塞直至其中一个通道的事件就绪。一旦方法返回后,线程就可以对事件进行处理。这些事件包括:网路连接,接收数据等等。