Java Nio 简明教程

Java NIO vs IO

正如我们所知,Java NIO 引入是为了提升常规 Java IO API。NIO 比 IO 更有效率的主要改进是 NIO 中使用的数据流模型,以及使用操作系统执行常规 IO 任务。

Java NIO 和 Java IO 之间的差异可以解释如下 −

  1. 如前一篇帖子中所述,NIO 中面向缓冲区和面向管道的 I/O 操作数据流,与 IO 相比,提供了更快的执行速度和更好的性能。同时,NIO 使用操作系统执行常规 I/O 任务,再次使其效率更高。

  2. NIO 和 IO 之间的另一个差异是:IO 使用流线数据流,即一次一个字节,并且依赖于将数据对象转换为字节,反之亦然;而 NIO 则处理由字节块组成的块数据。

  3. 在 Java IO 中,流对象是单向的,而在 NIO 中,管道是双向的,这意味着管道可以用于读写数据。

  4. IO 中的流线数据流不允许前后移动数据。如果需要在数据中前后移动,需要先将从流中读取的数据缓存到缓冲区中。而在 NIO 中,我们使用面向缓冲区的访问方式,它允许在无需缓存的情况下前后访问数据。

  5. NIO API 也支持多线程,以便可以异步地读写数据,这样在执行 IO 操作时,当前线程不会被阻塞。这使得它比传统 Java IO API 更高效。

  6. 多线程的概念是随 Selectors 引入的,它允许以异步或非阻塞方式监听多个 IO 事件通道。

  7. NIO 中的多线程使其变成非阻塞,这意味着只有在数据可用时才请求线程读写,否则可以将线程用于其他任务。然而,在传统 Java IO 中这是不可能的,因为它不支持多线程,使其成为阻塞方式。

  8. NIO 允许仅使用单个线程来管理多个通道,但代价是解析数据可能比从 Java IO 的阻塞流中读取数据时复杂得多。因此,如果需要使用非常高的带宽进行较少的连接并一次发送大量数据,那么在这个情况下 Java IO API 可能最合适。