📜  Java NIO与IO

📅  最后修改于: 2020-11-14 10:10:24             🧑  作者: Mango


众所周知,Java NIO是为常规Java IO API的改进而引入的。使NIO比IO更高效的主要增强功能是NIO中使用的通道数据流模型以及将操作系统用于常规IO任务。

Java NIO和Java IO之间的区别可以解释如下-

  • 如前一篇文章所述,用于I / O操作的NIO缓冲区和面向通道的数据流与IO相比提供了更快的执行速度和更好的性能.NIO还将操作系统用于常规I / O任务,这又使其效率更高。

  • NIO与IO之间差异的其他方面是,此IO使用流线数据流,即一次增加一个字节,并依赖于将数据对象转换为字节,反之亦然,而NIO处理数据块(字节块)。

  • 在Java IO中,流对象是单向的,而在NIO中,通道对象是双向的,这意味着通道可用于读取和写入数据。

  • IO中的流线型数据流不允许在数据中来回移动。如果需要从流中读取的数据来回移动,则需要先将其缓存在缓冲区中;对于NIO,我们使用面向缓冲区的数据流它允许来回访问数据而无需缓存。

  • NIO API还支持多线程,因此可以异步地读写数据,例如在执行IO操作时不会阻塞当前线程,这又使其效率比传统的Java IO API高。

  • Java NIO中的选择器的引入引入了多线程的概念,该选择器允许以异步或非阻塞方式侦听IO事件的多个通道。

  • NIO中的多线程将其设置为非阻塞,这意味着仅在数据可用时才请求线程进行读写,否则线程可以在其他任务中平均使用。但这在常规Java IO情况下是不可能的,因为没有多线程支持它,使其成为“阻止”。

  • NIO允许仅使用一个线程来管理多个通道,但是代价是解析数据可能比在Java IO的情况下从阻塞流中读取数据时要复杂得多,因此在需要较少连接且带宽很高的情况下与一次发送大量数据相比,在这种情况下,java IO API可能是最合适的选择。