(1)NIO 概览

java 1.4 后IO接口,N为Non-blocking,不单纯New。7后扩展应用于文件处理

与IO区别:

1)IO面向,NIO面向缓冲区

2)IO流阻塞,NIO流不阻塞

3)NIO有选择器,IO没有。

读数据和写数据方式:

通道进行数据读取 :创建缓冲区,然后请求通道读取数据。

从通道进行数据写入 :创建一个缓冲区,填充数据,并要求通道写入数据。

核心组件:Channels、Buffers、Selectors

二 NIO的特性/NIO与IO区别

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

Java IO面向从流中读字节,直至所有,缓存

NIO数据读入缓冲器,通道处理数据。

2 Non-blocking IO(非阻塞IO)

非阻塞IO操作。线程中从通道取数据到buffer,同时可继续做别的,当数据读取到buffer中后,线程再继续处理数据。写数据也是一样的。另外,非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待完全写入,这个线程同时可以去做别的事情。

IO流阻塞。线程read() 或 write()时被阻塞,直到数据被读取,或完全写入。

3 Selectors(选择器)

用于使用个线程处理多个通道。避免线程切换

三 读数据和写数据方式

通常来说NIO中的所有IO都是从Channel(通道)开始的。

从通道进行数据读取:创建一个缓冲区,然后请求通道读取数据。

从通道进行数据写入:创建一个缓冲区,填充数据,并要求通道写入数据。

数据读取和写入操作图示:

(1)NIO 概览_第1张图片

四 NIO核心组件简单介绍

核心的组件:Channels、Buffers、Selectors

通道

在Java NIO中,主要使用的通道如下(涵盖了UDP 和 TCP 网络IO,以及文件IO):

DatagramChannel

SocketChannel

FileChannel

ServerSocketChannel

缓冲区

在Java NIO中使用的核心缓冲区如下(覆盖了通过I/O发送的基本数据类型:byte, char、short, int, long, float, double ,long):

ByteBuffer

CharBuffer

ShortBuffer

IntBuffer

FloatBuffer

DoubleBuffer

LongBuffer

选择器

监视多个通道的对象,如数据到达连接打开等。单线程可以监视多个通道中数据。

如果应用程序有多个通道(连接)打开,但每个连接的流量都很低,则可考虑使用它。 例如:在聊天服务器中。

下面是一个单线程中Slector维护3个Channel的示意图:

(1)NIO 概览_第2张图片

要使用Selector的话,我们必须把Channel注册到Selector上,然后就可以调用Selector的select()方法。这个方法会进入阻塞,直到有一个channel的状态符合条件。当方法返回后,线程可以处理这些事件。

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