Java NIO(一) NIO的基本概念与使用

public class TestBuffer {

    /**
     * . 缓冲区 (Buffer):Java Nio中负责数据的 存取+缓冲就是数组.用于存储不同类型的数据
     *
     * 根据类型不同(boolean 除外) 都提供了对应的缓冲区
     * ByteBuffer
     * CharBuffer
     * ShortBuffer
     *
     * LongBuffer
     * FloatBuffer
     * DoubleBuffer
     *
     * 上述缓冲区的管理方式 几乎一致 通过allocate()获取缓冲区
     *
     * .缓冲区存取数据的两个核心方法
     * put():存入数据到缓冲区中
     * get():获取 缓冲区中的数据
     *
     *
     * .缓冲区4个核心方法(Class:Buffer)
     *  1.capacity 容量,表示缓冲区中最大存储的容量 一旦声明不能改写
     *  2.limit 界限, 表示缓冲区可以操作数据的大小.(limit 后数据不能进行读写)
     *  3.position 位置,表示缓冲区 正在操作数据的位置
     *  4.mark 标记 表示当前position的位置 可以通过reset()恢复到 mark的位置
     *
     * 0 <=mark<= position<= limit<=capacity
     *
     * .直接缓冲区与非直接缓冲区:
     *  非直接缓冲区:通过 allocate() 方法分配缓冲区, 将缓冲区建立在JVM的内存中
     *  直接缓冲区:  通过 allocateDirect() 方法分配直接缓冲区,将缓冲区建立在物理内存中.可以提高效率
     */

    public static void main(String[] args){
        String str= "Hello world";

        //1.分配一个大小
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
        System.out.println("--------------allocate初始化大小---------------");
        System.out.println("position:"+byteBuffer.position());
        System.out.println("limit:"+byteBuffer.limit());
        System.out.println("capacity:"+byteBuffer.capacity());


        //2.使用Put()方法 存入缓冲区数据
        byteBuffer.put(str.getBytes());
        System.out.println("--------------allocate存入数据后的变化---------------");
        System.out.println("position:"+byteBuffer.position());
        System.out.println("limit:"+byteBuffer.limit());
        System.out.println("capacity:"+byteBuffer.capacity());

        //3.如要读取数据 需要切换模式 调用flip()
        byteBuffer.flip();

        System.out.println("--------------allocate切换为读取模式的变化---------------");
        System.out.println("position:"+byteBuffer.position());
        System.out.println("limit:"+byteBuffer.limit());
        System.out.println("capacity:"+byteBuffer.capacity());

        //4.get 读取数据
        byte[] dst = new byte[byteBuffer.limit()];
        byteBuffer.get(dst);
        System.out.println(new String(dst,0,dst.length));
        System.out.println("--------------allocate切换为读取时的变化get()---------------");
        System.out.println("position:"+byteBuffer.position());
        System.out.println("limit:"+byteBuffer.limit());
        System.out.println("capacity:"+byteBuffer.capacity());

        //5.rewind()可重复读数据
        byteBuffer.rewind();
        System.out.println("--------------allocate切换为读取时的变化rewind()---------------");
        System.out.println("position:"+byteBuffer.position());
        System.out.println("limit:"+byteBuffer.limit());
        System.out.println("capacity:"+byteBuffer.capacity());

        //6.clear() 清空缓冲区 但是缓冲区中的数据依然存在,只是处于"被遗忘"状态
        byteBuffer.clear();
        System.out.println("---------------clear() 清空缓冲区--------------");
        System.out.println("position:"+byteBuffer.position());
        System.out.println("limit:"+byteBuffer.limit());
        System.out.println("capacity:"+byteBuffer.capacity());
        //读取第一个字符时 依然可以读取到
        System.out.println((char)byteBuffer.get());

    }
}
 

控制台输出:


--------------allocate初始化大小---------------
position:0
limit:1024
capacity:1024
--------------allocate存入数据后的变化---------------
position:11
limit:1024
capacity:1024
--------------allocate切换为读取模式的变化---------------
position:0
limit:11
capacity:1024
Hello world
--------------allocate切换为读取时的变化get()---------------
position:11
limit:11
capacity:1024
--------------allocate切换为读取时的变化rewind()---------------
position:0
limit:11
capacity:1024
---------------clear() 清空缓冲区--------------
position:0
limit:1024
capacity:1024
H

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值