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 可能是最佳选择。

广告