您的位置:首页 > 其它

小小了解一下NIO

2015-12-25 15:36 369 查看
nio:是javanonblocking(非阻塞)IO的简称。为所有的原始类型提供(Buffer)缓存支持。字符集编码解码解决方案。

Channel(通道): 一个新的原始I/O抽象。支持锁和内存映射文件的文件访问接口。提供多路(non-blocking)非阻塞式的高伸缩性网络I/O。

Java IO的各种流是阻塞的,这意味着,当一个线程调用read()或write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程可以去做别的事情。线程通常将非阻塞IO的空闲时间用于在其他通道上执行IO操作,所以一个单独的线程可以管理多个输入和输出通道(channel)。

Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制使得一个单独的线程很容易来管理多个通道。

NIO API的集中抽象为:

缓冲区,它们是数据容器;

字符集及相关解码器和编码器,它们在字节和Unicode字符之间进行转换;

各种类型的通道,它们表示到能够执行IO操作的实体的连接;

以及选择器和选择键,他们与可选择信道一起定义了多路的、无阻塞的I/O设施。

Channel是一个对象,可以通过它读取和写入数据。拿NIO与原来的I/O做个比较,通道就像是流,而且他们面向缓冲区的。所有数据都通过Buffer对象来处理,您永远不会将字节写入通道中,想反,是将数据写入包含一个或多个字节的缓冲区。同样,您不会直接从通道中读取字节,而是将数据从通道读入缓冲区,再从缓冲区获取这个字节。因为他们是双向的,所以通道可以比流更好地反应底层操作系统的真实情况。

缓冲区:是一个固定数据量的指定基本类型的数据容器。除内容之外,缓冲区还具有位置和界限。位置是要读写下一个元素的索引,界限是第一个应该读写的元素的索引。基本Buffer类定义了这些属性以及清除、反转和重绕方法,用以标记当前位置以及将当前位置重置为前一个标记处。每个非布尔类型都有一个缓冲区域,每个类定义了一系列用于将数据移入或移出缓冲区的get和put方法,用于压缩、复制和切片缓冲区的方法,以及用于分配新缓冲区和将现有数据包装到缓冲区中的静态方法。

Java NIO非堵塞技术实际是采取Reactor模式,或者说是Observer为我们监察I/O端口,如果有内容进来,会自动通知我们,这样,我们就不用开启多个线程死等。

NIO有一个主要的类Selector,这个类像是一个观察者,只要我们把需要探知的socketchannel告诉Selector,我们接着做别的事情,当有事件发生时,他会通知我们,传回一组SelectKey,我们读这些Key,就会获得我们刚刚注册过的socketchannel,然后,我们从这个Channel中读取数据,然后处理。

Selector内部原理实际是在做一个对所注册的channel的轮询访问,不断地轮询,一旦轮询到一个channel有所注册的事情发生,比如数据来了,他就会报告,交出一把钥匙,让我们通过这个钥匙来读取这个channel中的内容。

java NIO与IO

IO
NIO
流式(Stream oriented)
缓冲式(Buffer oriented)
阻塞IO
非阻塞IO
选择器(Selectors)
阻塞型IO和非阻塞型IO:
java IO的各种流是阻塞型的,这意味着一个线程调用read()或write()方法时,这个线程将一直被阻塞,直到有数据被读到或者数据被完全写入;在阻塞的同时,该线程不能做任何事情。
java NIO的非阻塞模式允许一个线程从一个channel中请求读取数据,这只会取到当前有效的数据或当前没有数据有效时获取不到任何数据;而不是一直阻塞指导所读取数据准备好为止;在这同时该线程可以做其他事情。
这个过程对非阻塞式数据写入也是成立的。一个线程可以写入一些数据到channel,但是不用等待数据被完全写入。该线程在请求完成后可以继续同时去做其他事情。当线程不在IO调用上被阻塞时,那么它们的空闲时间通常都花在了在其他channel上执行IO操作。也就是说,一个线程可以管理多个输入和输出的channel。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: