3.3 Java NIO

3.3 Java NIO

多路复用NIO

  • NIO: 在多路复用 IO模型(NIO)中,会有一个线程不断去轮询多个 socket 的状态,只有当 socket 真正有读写事件时,才真正调用实际的 IO 读写操作
  • 核心: Channel(通道),Buffer(缓冲区), Selector
    • NIO 基于 Channel 和 Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中
    • Selector(选择区)用于监听多个通道的事件
    • 与传统IO的区别:IO 是面向流的,NIO 是面向缓冲区的
      3.3 Java NIO

NIO缓冲区

  • IO:
    • 每次读取一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方
    • 不能前后移动流中的数据,如果要前后移动,需要先将它缓存到一个缓冲区
  • NIO
    • 数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动,这一点比IO更灵活
    • 但是,还需要检查是否该缓冲区中包含所有需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据

NIO非阻塞

  • NIO 的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取
  • NIO不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情
  • 所以一个单独的线程现在可以管理多个输入和输出通道(channel
    3.3 Java NIO

Channel

  • IO是单向的,如InputStream,OutputStream
  • Channel是双向的,即可以用来进行读操作,也可以进行写操作
  • 实现类:
    • FileChannel文件IO
    • DatagramChannel
    • SocketChannel
    • ServerSocketChannel

Buffer

  • 缓冲区,实际上是一个容器,是一个连续数组
  • Channel 提供从文件、网络读取数据的渠道,但是读取或写入的数据都必须经由 Buffer
    eg:
    3.3 Java NIO
  • Buffer是顶层父类,是一个抽象类
  • 子类:
    • ByteBuffer
    • IntBuffer
    • CharBuffer
    • LongBuffer
    • DoubleBuffer
    • FloatBuffer
    • ShortBuffer

Selector

  • Selector 能够检测多个注册的通道上是否有事件发生,如果有事件发生,便获取事件然后针对每个事件进行相应的响应处理