开发者社区> 问答> 正文

Java的NIO和OIO有哪些区别?

Java的NIO和OIO有哪些区别?

展开
收起
松岛菜菜 2021-10-29 15:43:27 615 0
来自:华章出版社
1 条回答
写回答
取消 提交回答
  • 在Java中,NIO和OIO的区别,主要体现在三个方面:

    (1)OIO是面向流(Stream Oriented)的,NIO是面向缓冲区(Buffer Oriented)的。

    何谓面向流,何谓面向缓冲区呢?

    OIO是面向字节流或字符流的,在一般的OIO操作中,我们以流式的方式顺序地从一个流(Stream)中读取一个或多个字节,因此,我们不能随意地改变读取指针的位置。而在NIO操作中则不同,NIO中引入了Channel(通道)和Buffer(缓冲区)的概念。读取和写入,只需要从通道中读取数据到缓冲区中,或将数据从缓冲区中写入到通道中。NIO不像OIO那样是顺序操作,可以随意地读取Buffer中任意位置的数据。

    (2)OIO的操作是阻塞的,而NIO的操作是非阻塞的。

    NIO如何做到非阻塞的呢?大家都知道,OIO操作都是阻塞的,例如,我们调用一个read方法读取一个文件的内容,那么调用read的线程会被阻塞住,直到read操作完成。 而在NIO的非阻塞模式中,当我们调用read方法时,如果此时有数据,则read读取数据并返回;如果此时没有数据,则read直接返回,而不会阻塞当前线程。NIO的非阻塞,是如何做到的呢?其实在上一章,答案已经揭晓了,NIO使用了通道和通道的多路复用技术。

    (3)OIO没有选择器(Selector)概念,而NIO有选择器的概念。

    NIO的实现,是基于底层的选择器的系统调用。NIO的选择器,需要底层操作系统提供支持。而OIO不需要用到选择器。

    资料来源:《Netty、Redis、ZooKeeper高并发实战》,文章链接:https://developer.aliyun.com/article/726757

    2021-10-29 15:49:31
    赞同 展开评论 打赏
问答分类:
问答地址:
来源圈子
更多
收录在圈子:
+ 订阅
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载