3.3 Java NIO
分类:
文章
•
2024-02-04 13:33:34
3.3 Java NIO
多路复用NIO
- NIO: 在多路复用 IO模型(NIO)中,会有一个线程不断去轮询多个 socket 的状态,只有当 socket 真正有读写事件时,才真正调用实际的 IO 读写操作
- 核心: Channel(通道),Buffer(缓冲区), Selector
- NIO 基于 Channel 和 Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中
- Selector(选择区)用于监听多个通道的事件
- 与传统IO的区别:IO 是面向流的,NIO 是面向缓冲区的
NIO缓冲区
- IO:
- 每次读取一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方
- 不能前后移动流中的数据,如果要前后移动,需要先将它缓存到一个缓冲区
- NIO
- 数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动,这一点比IO更灵活
- 但是,还需要检查是否该缓冲区中包含所有需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据
NIO非阻塞
- NIO 的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取
- NIO不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情
- 所以一个单独的线程现在可以管理多个输入和输出通道(channel
Channel
- IO是单向的,如InputStream,OutputStream
- Channel是双向的,即可以用来进行读操作,也可以进行写操作
- 实现类:
- FileChannel文件IO
- DatagramChannel
- SocketChannel
- ServerSocketChannel
Buffer
- 缓冲区,实际上是一个容器,是一个连续数组
- Channel 提供从文件、网络读取数据的渠道,但是读取或写入的数据都必须经由 Buffer
eg:
- Buffer是顶层父类,是一个抽象类
- 子类:
- ByteBuffer
- IntBuffer
- CharBuffer
- LongBuffer
- DoubleBuffer
- FloatBuffer
- ShortBuffer
Selector
- Selector 能够检测多个注册的通道上是否有事件发生,如果有事件发生,便获取事件然后针对每个事件进行相应的响应处理