一、Buffer基本使用
/**
* buffer正确使用姿势
* 1.向buffer写入数据,调用channel.read(buffer)
* 2.调用flip方法切换到读模式
* 3.从buffer读数据,通过get方法,每次读取一个字节或字符
* 4.调用clear方法或者compact方法切换到写模式
*/
@Slf4j
public class ByteBufferDemo {
public static void main(String[] args) {
//获取Channel有两种方法:
//1.通过输入输出流
//2.通过RandomAccessFile
//小技巧:.twr就可以快捷写出try(){}catch(Exception e){}的语句
try (FileChannel fileChannel = new FileInputStream("text.txt").getChannel()) {
//划分一块内存作为缓冲区,参数代表容量,表示10个字节
ByteBuffer buffer = ByteBuffer.allocate(10);
//从Channel读,写入缓冲区,返回-1表示读完了
while(fileChannel.read(buffer) != -1) {
//打印buffer的内容
//切换到buffer读模式
buffer.flip();
//读取buffer中的数据,get方法表示一次读一个字节
while(buffer.hasRemaining()) { //buffer检查是否还有剩余的数据
byte b = buffer.get();
log.info("从buffer中读取一个字符{}", (char)b);
}
buffer.clear();//切换到buffer写模式,或者调用compact方法
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
二、Buffer内部结构
重要属性:
1.capacity 容量
2.position 指针,读的位置,索引下标
3.limit 读写限制
flip方法从头开始,切换为读模式:
clear方式从头开始,切换为写模式:
compact方法是将没有读完的部分向前压缩然后切换为写模式: