NIO三个核心组件 ---- Buffer(缓冲区)
Buffer:缓冲区本质上是一个可以读写数据的内存块,可以理解成是一个容器对象(含数组),该对象提供了一组方法,可以更轻松的使用内存块,缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变换情况,Channel提供从文件,网络读取数据的渠道,但是读取或者写入的数据都必须经由BufferBuffer类以及子类1.Buffer是一个顶级父类,它是一个抽象类,有七个子类,除了boolean类型的...
Buffer:
缓冲区本质上是一个可以读写数据的内存块,可以理解成是一个容器对象(含数组),该对象提供了一组方法,可以更轻松的使用内存块,缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变换情况,Channel提供从文件,网络读取数据的渠道,但是读取或者写入的数据都必须经由Buffer
Buffer类以及子类
1.Buffer是一个顶级父类,它是一个抽象类,有七个子类,除了boolean类型的,其他基本数据类型的buffer子类都有,最常用的就是ByteBuffer
2.buffer四个属性来提供关于其所包含的数据元素的信息
capacity: 容量,在缓冲区创建时设定 并且不可变
limit: 表示缓冲区当前的终点
position: 位置,下一个要读或者写的索引
mark: 标记
Buffer类常用的一些方法
最常用的bytebuffer的方法:
下面列举一个Buffer的读取与存入的例子:
package com.jym.nio;
import java.nio.IntBuffer;
/**
* @program: JymNetty
* @description: 举例说明Buffer的使用
* @author: jym
* @create: 2020/01/31
*/
public class JymBuffer {
public static void main(String[] args) {
// 创建一个Buffer,大小为5,即可以存放5个int
IntBuffer intBuffer = IntBuffer.allocate(5);
// 向Buffer存放数据, intBuffer.capacity()为buffer的容量,put方法为存放
for(int i = 0; i<intBuffer.capacity();i++){
intBuffer.put(i+10);
}
// 如何取出数据
// 将buffer转换,读写切换,intBuffer.hasRemaining() 判断buffer里是否有数据
intBuffer.flip();
while (intBuffer.hasRemaining()){
System.out.println(intBuffer.get());
}
}
}
这里需要注意的是:在读写的时候,必须要调用切换方法flip()
每次添加或者读取的时候,position都会增加1,一直到与limit为止
Buffer的注意事项:
1.ByteBuffer 支持类型化的put和get,put放入的是什么类型,get就应该使用对应的数据类型来取出,否则可能有BufferUnderflowException异常
2 可以将一个普通Buffer转成只读Buffer,如果往只读Buffer添加元素,会产生ReadOnlyBufferException
代码说明:
package com.jym.nio;
import java.nio.ByteBuffer;
/**
* @program: JymNetty
* @description: Buffer注意事项
* @author: jym
* @create: 2020/02/01
*/
public class JymFileChannle4 {
public static void main(String[] args) {
ByteBuffer byteBuffer = ByteBuffer.allocate(10);
// 读取的时候也一定要按照顺序读取,比如要指定类型,否则可能会出错
byteBuffer.putChar('A');
byteBuffer.putInt(3);
byteBuffer.putShort((short) 4);
byteBuffer.putLong(10086);
// 转换成只读Buffer
ByteBuffer readOnlyBuffer = byteBuffer.asReadOnlyBuffer();
// 添加元素会报错ReadOnlyBufferException
readOnlyBuffer.put((byte) 1);
}
}
学习年限不足,知识过浅,说的不对请见谅。
世界上有10种人,一种是懂二进制的,一种是不懂二进制的。
更多推荐
所有评论(0)