本文共 1158 字,大约阅读时间需要 3 分钟。
一: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:聚集写入:将多个缓冲区中的数据聚集到通道中

转载地址:http://puql.baihongyu.com/