NIO学习笔记一
七种缓冲区Buffer
- ByteBuffer - 最常用的一种
- CharBuffer
- IntBuffer
- LongBuffer
- FloatBuffer
- DoubleBuffer
缓冲区管理方式
几乎一致,通过allocate() 获取缓冲区
缓冲区存取数据的核心方法
- put() 存入数据到缓存区中
- get() 获取缓冲区中的数据
缓冲区的四个核心属性
- capacity 容量,声明后不可改变
- limit 界限,表示缓冲区中可以操作数据的大小
- position 位置,表示缓冲区中正在操作的数据的位置
- mark 标记,记录当前position的位置,可以通过reset()恢复到mark的位置
- 0 <= mark <= position <= limit <= capacity
缓冲区读写模式
对于同一个缓冲区,在不同模式下,capacity不变,limit与position将会发生改变。
- 写模式
put()
clear() 清空缓冲区,(缓冲区数据仍然存在,但是出于被“遗忘”状态,就是因为position以及limit变了) - 读模式
flip() 切换到读取数据的模式
get()
rewind() 重读,position变为0
remain() 获取缓冲区中还有多少未读的数据
直接缓冲区与非直接缓冲区
- 非直接缓冲区
通过allocate()分配缓冲区,建立在jvm内存中 - 直接缓冲区
通过allocateDirect() 分配直接缓冲区,建立在物理内存中,可以提高效率。
传输图解
- 传统传输
- 读与写都要经过三次复制。
- NIO传输
- 通过物理内存映射文件,减少了中间的copy过程。
- 弊端:
- 直接建立在物理内存中,分配、销毁消耗大
- 应用程序写入物理内存中后,何时写入物理磁盘就不归程序管理。
- isDirect()方法判断是否直接缓冲区(抽象方法,由具体的实现类返回)