Java NIO 学习总结
NIO的特性/NIO与IO区别:
- 1)IO是面向流的,NIO是面向缓冲区的;
- 2)IO流是阻塞的,NIO流是不阻塞的;
- 3)NIO有选择器,而IO没有。
读数据和写数据方式:
- 从通道进行数据读取 :创建一个缓冲区,然后请求通道读取数据。
- 从通道进行数据写入 :创建一个缓冲区,填充数据,并要求通道写入数据。
NIO三大核心组件:Channels 、Buffers 、Selectors
1.Buffers
其实核心是最后的 ByteBuffer,前面的一大串类只是包装了一下它而已,我们使用最多的通常也是 ByteBuffer。
MappedByteBuffer 用于实现直接内存映射mmp。
Buffer 和数组差不多,它有 position、limit、capacity 几个重要属性。put() 一下数据、flip() 切换到读模式、然后用 get() 获取数据、clear() 一下清空数据、重新回到 put() 写入数据。
(1)mmp 和 Direct Buffer
2.Channels
FileChannel:文件通道,用于文件的读和写
DatagramChannel:用于 UDP 连接的接收和发送
SocketChannel:把它理解为 TCP 连接通道,简单理解就是 TCP 客户端
ServerSocketChannel:TCP 对应的服务端,用于监听某个端口进来的请求
(1)
3.Selectors
Selector 建立在非阻塞的基础之上,大家经常听到的多路复用世界中指的就是它,用于实现一个线程管理多个 Channel。
对于 Selector,我们还需要非常熟悉以下几个方法:
1. select()
调用此方法,会将上次 select 之后的准备好的 channel 对应的 SelectionKey 复制到 selected set 中。如果没有任何通道准备好,这个方法会阻塞,直到至少有一个通道准备好。
2. electNow()
功能和 select 一样,区别在于如果没有准备好的通道,那么此方法会立即返回 0。
3. select(long timeout)
看了前面两个,这个应该很好理解了,如果没有通道准备好,此方法会等待一会
4. wakeup()
这个方法是用来唤醒等待在 select() 和 select(timeout) 上的线程的。如果 wakeup() 先被调用,此时没有线程在 select 上阻塞,那么之后的一个 select() 或 select(timeout) 会立即返回,而不会阻塞,当然,它只会作用一次。
原文地址:https://www.cnblogs.com/shawshawwan/p/10029678.html