一:NIO简介
- 简介
- NIO和IO主要的区别
- 通道和缓冲区
二:NIO中的缓冲区
- 简介
缓冲区在java NIO中就是负责数据的存取,缓冲区就是数组,用于存储不同类型的数据。
并且根据数据类型不同(boolean除外),我们可以使用不同类型的缓冲区。例如:
ByteBuffer(这个最常用),CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer,
DoubleBuffer等。并且上面这几种缓冲区的管理方式几乎一致,通过allocate()获取缓冲区。 - 缓冲区存取数据的两个核心方法
a:put() -----> 表示存入数据到缓冲区
b:get() ----->表示获取缓冲区中的数据
c:ByteBuffer.allocate(1024).hasRemaining(); 表示判断缓冲区中是否还有可以获取的数据 - 缓冲区中的四大核心属性
a:capacity
表示容量,表示缓冲区中最大存储数据的容量。一旦声明就不能改变。
b:limit
表示界限,表示缓冲区中可以操作数据的大小。(limit后数据不能读写)
c:position
表示位置,表示缓冲区中正在操作数据的位置。
d:mark
表示标记,用来记录当前position的位置,可以通过reset()方法恢复到mark标记的位置。
0 <= position <= limit <= capacity
- 不同情况下缓冲区的各个属性值
a:代码示例
b:效果
c:解析图
c:mark标记的相关示例
效果:
三:NIO直接缓冲区和非直接缓冲区
- 什么是直接缓冲区和非直接缓冲区?
直接缓冲区:就是通过allocate()方法分配的缓冲区,是将缓冲区建立在JVM的内存中。
非直接缓冲区:就是通过allocateDirect()方法分配的缓冲区,将缓冲区分配在物理内存中。
(物理内存就是你的内存条的实际内存,虚拟内存是设在硬盘上用作内存的虚拟的内存)
四: NIO通道(Channel)的原理与获取
- 什么是通道?
总结:
通道就是用于源节点和目标节点的链接。在java NIO中负责缓冲区中数据的传输,Channel本身
不存储数据,因此需要配合缓冲区进行传输。
五: 相关文件操作实例
- 使用通道完成jpg格式照片的复制(使用的是非直接缓冲区)
a:代码如下
b:效果
- 使用通道完成jpg格式照片的复制(使用的是直接缓冲区)
a:代码(这种方式效率虽然高,但是它无法及时释放内存,可能会导致物理内存被占用过多)
b:效果
- 通道之间的数据传输(直接缓冲区的方法)
a:代码
效果:
六: 分散读取与聚集写入
- 什么是分散读取和聚集写入
a:分散读取:将通道中的数据分散到多个缓冲区中
b:聚集写入:将多个缓冲区中的数据聚集到通道中