Java NIO全称java non-blocking IO,是JDK1.4及以上版本里提供的可以替代标准Java IO API的新IO API(New IO),

为所有的原始类型(boolean类型除外)提供缓存支持的数据容器,使用它可以提供非阻塞式的高伸缩性网络。

Java NIO提供了与标准IO不同的IO工作方式。Java NIO由以下几个核心部分组成:

Channels(通道)

Buffers(缓冲区)

Selectors(选择器)

虽然Java NIO中除此之外还有很多类和组件,但是最主要的是Channel,Buffer和Selector构成了核心的API。

Channels和Buffers(通道和缓冲区)

    标准的IO基于字节流和字符流进行读写操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行读写操作,

数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。所有的IO在NIO中都从一个Channel开始。

拿NIO与原来的IO做个比较,通道就像是流,而且他们面向缓冲区(Buffer)的。通道与流的不同之处在于通道是双向的。

而流只是在一个方向上移动。数据可以从Channel读出到Buffer中,也可以从Buffer写到Channel中,

即通道可以用于读、写或者同时用于读写。如图:

Java NIO概述


Channel和Buffer有好几种类型。

Java NIO中主要的Channel实现:

FileChannel

DatagramChannel

SocketChannel

ServerSocketChannel

这些通道涵盖了UDP和TCP网络IO,以及文件IO。

Java NIO中主要的Buffer实现:

ByteBuffer

CharBuffer

DoubleBuffer

FloatBuffer

IntBuffer

LongBuffer

ShortBuffer

MappedByteBuffer

这些Buffer覆盖了你能通过IO发送的基本数据类型:byte, short, int, long, float, double和char。

Non-blocking IO(非阻塞IO)

Java NIO可以让你非阻塞的使用IO,例如:当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情。

当数据被写入到缓冲区时,线程可以继续处理它。从缓冲区写入通道也类似。


Selectors(选择器)

Java NIO引入了选择器的概念,选择器用于监听多个通道的事件(比如:连接打开,数据到达)。

因此,单个的线程可以监听多个数据通道。Selector允许单线程处理多个Channel。

如果你的应用打开了多个连接(通道),但每个连接的流量都很低,使用Selector就会很方便。

例如,在一个聊天服务器中。这是在一个单线程中使用一个Selector处理3个Channel的图示:

Java NIO概述

要使用Selector,得向Selector注册Channel,然后调用它的select()方法。

这个方法会一直阻塞到某个注册的通道有事件就绪。一旦这个方法返回,

线程就可以处理这些事件,事件的例子有如新连接进来,数据接收等。


相关文章: