[Java] Java NIO与IO

参考博客

https://www.cnblogs.com/xiaoxi/p/6576588.html

NIO在JDK1.4中被引入,与IO包作用相似,但由于其主要用到块,因此效率高一些。

IO:面向流、阻塞式

NIO:面向缓冲、非阻塞、有选择器(进行多个Channel的复用)

Q:这里所说的“缓冲”,和Linux IO中的“缓冲IO”有什么关系?

A:没有关系,那个是系统层面,这里我们只关心程序层面。例如当讲到IO无缓冲时,意思是不会在用户空间隐式地为IO流开辟一个缓冲区,并不代表系统的高速缓存页不保存数据。

1. IO

基于字节流/字符流,这意味着每次会从流种读取一个或多个字符/字节(流不能被移动,只能被读出或写入,像一个双向队列),同时这也意味着IO是阻塞式的(例如,readlines时,需要等待该行的数据被读取进进程空间)。

2. NIO

基于缓冲区,是非阻塞式。其核心为Channel、Buffer和Selector。

Channel(通道),与Stream(流)相对应,但Stream是单向的,而Channel是双向的(即可以写也可以读)。

Buffer(缓冲区)

Selector(选择器),管理一到多个Channel,使用时向Selector注册Channel,然后调用其Select方法。之后会阻塞到某个组测的通道有事件就绪。当返回时,线程即可处理IO事件。(这不就是Select IO复用模型吗=_=)。

 

NIO模型在使用时采用Reactor模型。即由一个专门的线程处理IO事件,由他根据访问访问请求启动新的处理线程或者,或根据事件唤醒相应的处理线程。(这么一看又像epoll)

posted @ 2021-10-21 09:46  Cheung-10  阅读(1)  评论(0)    收藏  举报