美文网首页3
NIO (New I/O)

NIO (New I/O)

作者: happyJared | 来源:发表于2019-08-06 07:36 被阅读11次

NIO 是一种同步非阻塞的 I/O 模型,Java 1.4 中引入了 NIO 框架,对应 java.nio 包,提供了 Channel , Selector,Buffer 等抽象。

NIO 中的 N 可以理解为 Non-blocking,不单纯是 New。它支持面向缓冲的、基于通道的 I/O 操作方法。 NIO 提供了与传统 BIO 模型中的 SocketServerSocket 相对应的 SocketChannelServerSocketChannel 两种不同套接字通道的实现,两种通道都支持阻塞和非阻塞两种模式。阻塞模式使用就像传统中的支持一样,比较简单,但是性能和可靠性都不好;非阻塞模式正好与之相反。对于低负载、低并发的应用程序,可以使用同步阻塞 I/O 来提升开发速率和更好的维护性;对于高负载、高并发的(网络)应用,应使用 NIO 的非阻塞模式来开发。

Non-blocking IO(非阻塞IO)

IO 流是阻塞的,NIO 流是不阻塞的。

Java NIO 使我们可以进行非阻塞 IO 操作。比如说,单线程中从通道读取数据到 buffer,同时可以继续做别的事情,当数据读取到 buffer 中后,线程再继续处理数据。写数据也是一样的。另外,非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。

Java IO 的各种流是阻塞的。这意味着,当一个线程调用 read()write() 时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。

Buffer(缓冲区)

IO 面向流(Stream oriented),而 NIO 面向缓冲区(Buffer oriented)。

Buffer 是一个对象,它包含一些要写入或者要读出的数据。在 NIO 类库中加入 Buffer 对象,体现了新库与原 I/O 的一个重要区别。在面向流的 I/O 中·可以将数据直接写入或者将数据直接读到 Stream 对象中。虽然 Stream 中也有 Buffer 开头的扩展类,但只是流的包装类,还是从流读到缓冲区,而 NIO 却是直接读到 Buffer 中进行操作。

在 NIO 厍中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的; 在写入数据时,写入到缓冲区中。任何时候访问 NIO 中的数据,都是通过缓冲区进行操作。

最常用的缓冲区是 ByteBuffer,一个 ByteBuffer 提供了一组功能用于操作 byte 数组。除了 ByteBuffer,还有其他的一些缓冲区,事实上,每一种 Java 基本类型(除了 Boolean 类型)都对应有一种缓冲区。

Channel (通道)

NIO 通过 Channel(通道) 进行读写。通道是双向的,可读也可写,而流的读写是单向的。无论读写,通道只能和 Buffer 交互。因为 Buffer,通道可以异步地读写。

Selectors(选择器)

NIO 有选择器,而 IO 没有。选择器用于使用单个线程处理多个通道。因此,它需要较少的线程来处理这些通道。线程之间的切换对于操作系统来说是昂贵的。 因此,为了提高系统效率,选择器是非常有用的。

单线程中 Selector 维护3个 Channel 示意图

相关文章

  • 4.2.1、I/O模型

    NIO NIO(Non-blocking I/O,在Java领域,也称为New I/O),是一种同步非阻塞的I/O...

  • NIO.2-简介

    More New I/O Java 7 中的 More New I/O APIs,通过在 java.nio.cha...

  • BIO-NIO-AIO

    BIO (Blocking I/O):同步阻塞I/O模式。 NIO (New I/O):同步非阻塞模式。 AIO ...

  • NIO学习总结

    NIO NIO称为Non-blocking I/O 或 New I/O,就是非阻塞IO或者新IO BIO网络模型 ...

  • NIO

    NIO (New I/O): NIO是一种同步非阻塞的I/O模型,在Java 1.4 中引入了NIO框架,对应 j...

  • IO vs NIO vs NIO.2

    I/O vs NI/O vs NIO.2 NIO 'N' 是 New 还是 Non-Blocking? IO 这里...

  • NIO (New I/O)

    NIO 是一种同步非阻塞的 I/O 模型,Java 1.4 中引入了 NIO 框架,对应 java.nio 包,提...

  • Java NIO详解

    NIO含义 New I/O,原因在于它相对于之前的I/O类库是新增的。由于之前老的I/O类库是阻塞I/O,New ...

  • NIO Reactor模式

      NIO(Non-blocking I/O,在Java领域,也称为New I/O),是一种同步非阻塞的I/O模型...

  • 什么是JAVA NIO

    NIO(Non-Blocking I/O,java中,也称为New I/O),是一种同步非阻塞的I/O模型,也是I...

网友评论

    本文标题:NIO (New I/O)

    本文链接:https://www.haomeiwen.com/subject/vjrpdctx.html