Java的NIO与IO的详解及对比
Java的NIO与IO的区别
NIO是JDK1.4引入的异步IO,NIO核心部分就是三点:
- Channel
- Buffer
- Selector
NIO与IO对比
NIO与IO的区别,总体上来说体现在三个方面:
- IO基于流(Streamoriented),而NIO基于Buffer(Bufferoriented)
- IO操作是阻塞的,而NIO操作是非阻塞的
- IO没有selector概念,而NIO有selector概念.
基于Stream与基于Buffer
传统的IO是面向字节流或字符流的,而在NIO中,我们抛弃了传统的IO流,而是引入了Channel和Buffer的概念。在NIO中,我只能从Channel中读取数据到Buffer中或将数据从Buffer中写入到Channel。
那么什么是基于流呢?在一般的JavaIO操作中,我们以流式的方式顺序地从一个Stream中读取一个或多个字节,因此我们也就不能随意改变读取指针的位置。
而基于Buffer就显得有点不同了.我们首先需要从Channel中读取数据到Buffer中,当Buffer中有数据后,我们就可以对这些数据进行操作了。不像IO那样是顺序操作,NIO中我们可以随意地读取任意位置的数据。
阻塞和非阻塞
Java提供的各种Stream操作都是阻塞的,例如我们调用一个read方法读取一个文件的内容,那么调用read的线程会被阻塞住,直到read操作完成。而NIO的非阻塞模式允许我们非阻塞地进行IO操作.。例如我们需要从网络中读取数据,在NIO的非阻塞模式中,当我们调用read方法时,如果此时有数据,则read读取并返回;如果此时没有数据,则read直接返回,而不会阻塞当前线程。
selector
selector是NIO中才有的概念,它是JavaNIO之所以可以非阻塞地进行IO操作的关键。通过Selector,一个线程可以监听多个Channel的IO事件,当我们向一个Selector中注册了Channel后,Selector内部的机制就可以自动地为我们不断地查询(select)这些注册的Channel是否有已就绪的IO事件(例如可读,可写,网络连接完成等)。通过这样的Selector机制,我们就可以很简单地使用一个线程高效地管理多个Channel了。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!