Java NIO(1) 概述

什么是Java NIO

    NIO全名(NewInput/ Output),在java1.4中引入。NIO是一种同步非阻塞的IO模型。同步是指线程不断轮询IO事件是否就绪,非阻塞是指线程在等待IO的时候,可以同时做其他任务。同步的核心就是Selector,Selector代替了线程本身轮询IO事件,避免了阻塞同时减少了不必要的线程消耗;非阻塞的核心就是通道和缓冲区,当IO事件就绪时,可以通过写道缓冲区,保证IO的成功,而无需线程阻塞式地等待。

JavaNIO由以下几个核心部分组成:

1,Channels

2,Buffer

3,Selectors

    虽然JavaNIO中除此之外还有很多类和组件,但在我看来,Channel,Buffer和Selector构成了核心的API。其它的组建是基于这个三个核心组建的扩展,所再次不再赘述。

1)Channel

基本上,所有的IO在NIO中都从一个Channel开始。Channel可以认为其就是一个管道,Channel可以读Buffer中数据,也可以将数据写入Buffer。这里有个图示:


Java NIO(1) 概述_第1张图片

Channel有好几种类型。下面是JAVA NIO中的一些主要Channel的实现:

1,FileChannel

2,  DatagramChannel

3,  SocketChannel

4,  ServerSocketChannel

正如你所看到的,这些通道涵盖了UDP和TCP网络IO,以及文件IO。

2) Buffer

以下是Java NIO里关键的Buffer实现:

1, ByteBuffer

2, CharBuffer

3, DoubleBuffer

4, FloatBuffer

5, IntBuffer

6, LongBuffer

7, ShortBuffer

8, MappedByteBuffer

这些Buffer覆盖了你能通过IO发送的基本数据类型:byte, short, int, long, float, double和char。以及MappedByteBuffer,用于表示内存映射文件。

3)Selector

    Selector允许单线程处理多个Channel。如果你的应用打开了多个连接(通道),但每个连接的流量都很低,使用Selector就会很方便。例如,在一个聊天服务器中。

这是在一个单线程中使用一个Selector处理3个Channel的图示:


Java NIO(1) 概述_第2张图片

    要使用Selector,得向Selector注册Channel,然后调用它的select()方法。这个方法会一直阻塞到某个注册的通道有事件就绪。一旦这个方法返回,线程就可以处理这些事件,事件的例子有如新连接进来,数据接收等。

你可能感兴趣的:(Java NIO(1) 概述)