JavaNIO概览

关键字:

    .Channels and Buffers

    .Selectors



Java NIO 由下面三个核心组件组成

.Channels

.Buffers

.Selectors

Java NIO除了上面这三个组件之外,还有许多其他类和组件。但是Channel、Buffer、以及 Selector是主要的核心API。在我看来,其他的组件,如:Pipe 、FileLock 都是一些供核心组件使用的工具类。因此,我将聚焦于这三个核心组件上。其他组件会在其他篇幅中讲述。


1.Channel和Buffer

一般来说,NIO都是从Channel开始。 Channel有点像流stream。可以从Channel中把数据读到Buffer中,也可以从buffer中把数据写入到Channel中。

这里有个图例:


JavaNIO概览_第1张图片
Java NIO: Channel把数据读入到Buffer中,Buffer把数据写入到Channel中

在Java NIO中有不少Channel和Buffer类型,下面列出一些主要的Channel实现:

   .FileChannel

  .DatagramChannel

  .SocketChannel

  .ServerSocketChannel

正如你看到的那样,这些channel既包含了UDP、TCP 网络IO也包含文件IO。

下面列出一些核心的Java NIO中的Buffer核心实现:

     .ByteBuffer

    .CharBuffer

    .DoubleBuffer

    .FloatBuffer

    .IntBuffer

    .LongBuffer

    .ShortBuffer

这些Buffer也包含了基本数据类型,这样你就可以通过IO去发送 byte,short,int ,long,float,double,以及字符类型的数据。  Java NIO中还有一个MappedByteBuffer,它主要是用于连接内存映射文件。我们稍后再讲这个Buffer。


2.Selectors

Selector 允许一个单线程处理多个Channel。 如果你的应用程序有许多连接(Channel)打开的话,这样是很方便的。但是每一个连接上却只有很少的流量。 例如,在一个chat server上,就可以这样做。

  这里有一个图展示了一个线程如何使用一个Selector管理3个Channel的:


JavaNIO概览_第2张图片
一个线程使用一个selector管理3个channel

为了使用Selector,你首先需要把三个Channel注册到该Selector上。然后,你可以调用select()方法。这个方法会一直阻塞,直到这三个Channel中的其中一个有事件发生(event ready)。一旦这个方法返回,这个线程就能处理这些事件。这些事件例如:新连接到达事件,数据接收事件等。

你可能感兴趣的:(JavaNIO概览)