NIO 跟 I/O 相比,哪个更好用?为什么?
回答·8
最热
最新
- 什么叫好用…看情况吧……
- 放大一点,就是文件流、字节流、nio 的区别。如果没记错的话,文件流是每 write 一次就刷写一次磁盘,涉及到用户内核态转换。字节流是写满 8k 刷写一次,触发用户内核态切换。nio 是在堆外开辟一块空间,用 mapperdbytebuffer 作为映射,将内核空间数据映射到堆外,避免了用户内核态切换,大概意思是这样
- 少量连接,bio 性能不会比 nio 差,甚至表现可能更优秀。nio 主要用于需要大量连接的场景下,这种情况下 bio 是没办法支撑的
- IO 阻塞IO等待数据写入或返回前的读取。Java IO的各种流是阻塞的。这意味着当线程调用write()或read()时,线程会被阻塞,直到有一些数据可用于读取或数据被完全写入。 面向流的 流是单向写入数据 NIO 非阻塞IO不等待返回前读取或写入数据。 Java NIO非阻塞模式允许线程请求向通道写入数据,但不等待它被完全写入。允许线程继续进行,并做其他事情。 面向缓冲 通道是双向写入数据
- 1、增加了一个角色,要有一个专门负责收集客人需求的人。NIO里对应的就是Selector。 2、由阻塞服务方式改为非阻塞服务了,客人吃着的时候服务员不用一直侯在客人旁边了。传统的IO操作,比如read(),当没有数据可读的时候,线程一直阻塞被占用,直到数据到来。NIO中没有数据可读时,read()会立即返回0,线程不会阻塞。 NIO中,客户端创建一个连接后,先要将连接注册到Selector,相当于客人进入餐厅后,告诉前台你要用餐,前台会告诉你你的桌号是几号,然后你就可能到那张桌子坐下了,SelectionKey就是桌号。当某一桌需要服务时,前台就记录哪一桌需要什么服务,比如1号桌要点菜,2号桌要结帐,服务员从前台取一条记录,根据记录提供服务,完了再来取下一条。这样服务的时间就被最有效的利用起来了。
- 没有更好用。nio 适合密集型 socket,bio 适合大文件,实时性要求高!
- 你以为 NIO 不是 IO? 看看操作系统 IO 模型。
- 一个一直轮询接收消息,一个消息来了才继续。一直轮询随时可以发消息,阻塞的只能收到消息后才发消息。场景不一样