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 可能是最合适的。