package Netty与NIO的前生今世3;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
/**
* Buffer的基本理解
* 缓冲区对象本质上一个数组,但它其实是一个特殊的数组,缓冲区对象内置了一些机制,
* 能够跟踪记录和缓冲区的状态变化情况,如果我们使用get方法从缓冲区获取数据或是
* 使用put方法把数据写入缓冲区的状态变化情况,都会引起缓冲区状态的变化
*
* 缓冲区的三个重要属性
* 1)position:指定下一个将要被写入或者读取的元素索引,它的值有get/put方法自动更新,在
* 创建一个Buffer对象时,position被初始化为0.
*
* 2) limit:指定还有多少数据需要读取(从缓冲区写入通道时),或者还有多少空间可以写入数据(从通道读入缓冲区
*
* 3)capacity:指定了可以存储在缓冲区中的最大数据容量,实际上,它是指定底层数组的大小,
* 或者至少是指定了准许我们使用的底层数组容量。
*
*
*/
class BufferDemo{
public BufferDemo() throws IOException {
//这里用的是文件I/O处理
FileInputStream fileInputStream=new FileInputStream("C:\\IO\\io.txt\\001.txt");
//创建文件的操作管道
FileChannel fileChannel=fileInputStream.getChannel();
//分配一个10个大小的缓冲区,其实就是分配一个10大小的Byte数组
ByteBuffer byteBuffer=ByteBuffer.allocate(10);
output("初始化",byteBuffer);
//先读一下
fileChannel.read(byteBuffer);
output("调用read()",byteBuffer);
//准备操作之前,先锁定操作范围
byteBuffer.flip();
output("调用flip()",byteBuffer);
//判断有没有可读数据
while (byteBuffer.remaining()>0){
byte b =byteBuffer.get();
System.out.println((char)b);
}
output("调用get()",byteBuffer);
//可以理解为解锁
byteBuffer.clear();
output("调用clear()",byteBuffer);
//最后把管道封闭
fileChannel.close();
}
private void output(String step, Buffer buffer) {
System.out.println(step+" : ");
//容量,数组大小
System.out.println("capacity:"+buffer.capacity()+",");
//当前操作数据所在位置,也可以叫做游标
System.out.println("position:"+buffer.position()+",");
//锁定值,flip,数据操作范围索引只能在position-limit之间
System.out.println("limit:"+buffer.limit());
System.out.println();
}
}
public class N3112 {
public static void main(String[] args) throws IOException {
BufferDemo bufferDemo =new BufferDemo();
}
}