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可能更为合适,一个线程一个连接。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值