java,NIO与IO之间的区别

在项目的使用中会遇到这样的问题:什么时候用io接口,什么时候用nio接口,我们将在这里比较Java NIO和IO的区别,他们的使用场景,如何利用他们高效的编码

Java NIO和IO的主要区别
IO:基于Stream,是线程阻塞的
NIO:是基于BUffer,是线程非阻塞的,Selector(选择器)支持

基于Stream和基于Buffer之间的区别:
Java IO 基于Stream以为这我们每次从Stream中读取一个或多个字节,我们如何处理读取到字节取决于我们自身的需求,这些字节并不会缓存在任何地方。而且我们不能再Stream的数据中前后来回移动;如果要实现从流中读取数据中来回移动,就得首先蒋这些数据保存在一个缓存中。

Java NIO是基于Buff的方式则有所不同,数据读取到buffer中再进行处理我们可以更具需求在Buffer中前后来回移动,这样在处理数据时提供了更多的灵活性。然而,我们也需要检查buffer是否包含我们需要处理的所有数据;我们还需要保证在读取更多数据的时候,新的数据不会覆盖buffer中未处理的数据。

2.阻塞 VS 非阻塞
Java IO的各种流Stream都是阻塞,这就意味着当一个线程执行read()或者write()方法的时候,线程会阻塞直到读到数据或者写入完成,这时线程无法做其他任何操作。

Java NIO的非阻塞模式则允许线程请求从Channel中读取数据时,只需要获取当前可读的数据或者当无数据可读时不读取任何数据就返回。相比于阻塞线程直到数据可读,线程可以做些其他操作。非阻塞写操作也是一样的,线程可以请求写入数据到一个Channel,但并不会阻塞等待数据全部写入,线程可以同时执行其他操作。

你可能会思考,当用非阻塞IO方法时,线程如何花费它的空闲时间,通常线程会去操作其他IO channel。这就是为什么一个单线程可以同时管理多个Channel处理输入输出。

Selectors
Java NIO 的Selector允许一个线程管理多个Channel,我们可以注册多个Channel到Selector中,然后使用一个线程去“select”可以处理的Channel。这种机制使得单线程管理多个Channel变得简单。

NIO 和 IO是如何影响应用程序设计的
当你选择NIO或者IO作为应用的数据交互工具时可能需要从以下几个方面进行考虑程序设计:

调用NIO或者IO类的接口
数据的处理流程

NIO允许我们使用单一线程管理多个channel(多个网络连接或者多个文件);但是相比从阻塞流中读取数据而言,NIO数据的处理会显得稍微复杂一些。

如果需要需要同时管理成千上万的链接,并且每个都发送少量的数据,例如聊天服务器;实现这样的服务器NIO显得更有优势一些。或者需要保持大量的链接到其他的计算机,例如P2P网络,使用一个线程管理所有的链接也比较有优势。

NIO允许我们使用单一线程管理多个channel(多个网络连接或者多个文件);但是相比从阻塞流中读取数据而言,NIO数据的处理会显得稍微复杂一些。

如果需要需要同时管理成千上万的链接,并且每个都发送少量的数据,例如聊天服务器;实现这样的服务器NIO显得更有优势一些。或者需要保持大量的链接到其他的计算机,例如P2P网络,使用一个线程管理所有的链接也比较有优势。

猜你喜欢

转载自blog.csdn.net/weixin_43889681/article/details/88311099