Java NIO 之 NIO与IO比较

本章主要介绍NIO和IO之间的主要区别。

一、面向流和面向缓冲

    Java中NIO和IO最直接的区别就是,IO面向流,NIO面向缓冲区。IO面向流,每次从流中读出一个或多个字节,直至读取所有的字节,它们没有被缓存在任何地方,且不能前后移动数据,除非先缓存到一个缓冲区中。而在NIO中,数据不管是写入还是读出Channel,都需要缓冲区Buffer的支持,且有了Buffer,也增加了处理过程中的灵活性。

二、阻塞与非阻塞IO

    Java IO的各种流都是阻塞的,当一个线程调用read或者write时,该线程被阻塞,知道数据传输完成。而在NIO的非阻塞模式下,一个线程从某个通道发送请求读取数据,则仅能得到目前可用的数据,当没有数据可用时,不需要阻塞等待,而是直接退出。写入也是一样,不需要等待它完全写入,就可以去做别的事情。线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程可以管理多个输入输出通道。

三、选择器

    NIO中的选择器Selector允许一个单独的线程来监视多个输入通道,可以向一个选择器注册多个通道,然后使用一个单独的线程来选择并管理这些通道。

四、总结

    NIO可以让我们只使用一个或少数的线程来管理多个通道(网络连接或文件),但代价是解析数据可能更加复杂。
    如果需要管理同时打开的成千上万个连接,使用阻塞的IO来获取消息显然是被动的。如果连接每次只是发送少量消息,比如聊天服务器,实现NIO的服务器是有优势的,可以让单个线程管理多个连接。但是如果少量连接大量数据的模式,传统的IO可能更为合适,一个线程一个连接。

猜你喜欢

转载自blog.csdn.net/u010771890/article/details/76577607