Java NIO 与 IO


我们知道,java NIO 是为了改进传统的 java IO API 而引入的。使 NIO 比 IO 更高效的主要增强是 NIO 中使用的通道数据流模型以及对传统 IO 任务使用操作系统。

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

  • 正如前一篇文章中提到的,NIO 缓冲区和面向 I/O 操作的通道数据流与 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 可能是最合适的。