Java NIO 与IO的区别

在jdk1.4中,引入了NIO(NEW IO),其与传统的IO有着很大的差别,具体表现在:

这里写图片描述


1:面向流与面向缓冲区

传统IO面向流的,意味着每次从流中读取一个字节或多个字节,直到读取完所有字节,而没有缓冲的,想要缓冲的就得使用相应的缓冲流。对于InputStream与OutputStream要么是输入流,要么是输出流而不能复用。NIO是面向缓冲区的,说道缓冲区就必须要提到通道,什么是通道与缓冲区?可以这样理解,通道就好比铁路,而缓冲区就好比火车,通道起到是连接的目的,而具体的数据传输是放在‘火车’上的,有了铁路,火车才能跑,同时火车也可以在铁路上双向的来回跑。即缓冲区是实际用来保存数据的,而其必须基于通道的,NIO也可以双向的传输。


2:阻塞IO与非阻塞IO

传统IO在服务器会一直阻塞的,直到客户端的接入,解决此方式的方法就是使用多线程,对于每一个请求都启动创建一个新的线程来进行连接,当请求并发量很大时候,毫无疑问创建的线程数将是巨大的,而线程之间的切换又是耗时的,性能上毫无疑问会有很大影响。

传统IO多线程下示意图:

这里写图片描述

Java NIO为非阻塞模式。读写请求并不会阻塞当前线程,在数据可读/写前当前线程可以继续做其它事情,所以一个单独的线程可以管理多个输入和输出通道

NIO示意图:
这里写图片描述


3:选择器的有无
NIO的通道,缓冲区,以及选择器是实现非阻塞IO流的基础。选择器Selector能够检测多个注册的通道上是否有事件发生,在使用的时候,需要先将事件注册到选择器上,这样就可以用一个线程管理多个通道。

Java NIO的Buffer
Java NIO的Channel
Java NIO的Scatter与Gather
Java NIO的非阻塞式网络通讯

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值