NIO学习(八):Java NIO的Buffer的slice和asReadOnlyBuffer方法以及链式写法

背景

无论是slice()方法还是asReadOnlyBuffer()方法,他们虽然会返回一个Buffer的具体实例,但是都是指向同一个内存区域。


slice 和 asReadOnlyBuffer
slice
  1. 测试代码
 public static void main(String[] args) {
        ByteBuffer buffer = ByteBuffer.allocate(10);

        for (int i = 0; i< buffer.capacity(); i++) {
            buffer.put((byte)i);
        }

        buffer.position(2);
        buffer.limit(6);

        ByteBuffer sliceBuffer = buffer.slice();

        for (int i = 0; i < sliceBuffer.capacity(); i++) {
            byte b = sliceBuffer.get(i);
            b *= 2;
            sliceBuffer.put(i, b);
        }
        buffer.position(0);
        buffer.limit(10);
        while (buffer.hasRemaining()) {
            System.out.print(buffer.get() + " ");
        }
    }
  1. 结果
    在这里插入图片描述
    上图中高亮的,4,6,8,10就是修改的sliceBuffer中的内容,但是原来的buffer中的内容也被修改了,这说明他们指向同一个内存区域。

asReadOnlyBuffer
  1. 基本测试代码
 public static void main(String[] args) {
        ByteBuffer buffer = ByteBuffer.allocate(10);
        System.out.println(buffer.getClass());

        for (int i = 0; i < buffer.capacity(); i++) {
            buffer.put((byte)i);
        }

        ByteBuffer readonlyBuffer = buffer.asReadOnlyBuffer();
        System.out.println(readonlyBuffer.getClass());
    }
  1. 结果
    在这里插入图片描述
  2. 修改只读readonlyBuffer
 public static void main(String[] args) {
        ByteBuffer buffer = ByteBuffer.allocate(10);
        System.out.println(buffer.getClass());

        for (int i = 0; i < buffer.capacity(); i++) {
            buffer.put((byte)i);
        }

        ByteBuffer readonlyBuffer = buffer.asReadOnlyBuffer();
        System.out.println(readonlyBuffer.getClass());

        // 修改只读readonlyBuffer
        readonlyBuffer.put((byte)3);
    }
  1. 结果(抛出只读异常)
    在这里插入图片描述
  2. 测试修改内容
public static void main(String[] args) {
        ByteBuffer buffer = ByteBuffer.allocate(10);

        for (int i = 0; i < buffer.capacity(); i++) {
            buffer.put((byte)i);
        }

        ByteBuffer readonlyBuffer = buffer.asReadOnlyBuffer();

        for (int j = 0; j < buffer.capacity(); j++) {
            int value =  readonlyBuffer.get(j);
            System.out.print(value + " ");
        }
        System.out.println();

        // 重置buffer中的position=0,limit=capacity=10
        buffer.clear();

        // 修改源buffer中的内容
        for (int k = 0; k < buffer.capacity(); k++) {
            int va = k * 2;
            buffer.put((byte)va);
        }

        // 打印修改后的内容
        for (int j = 0; j < buffer.capacity(); j++) {
            int value =  readonlyBuffer.get(j);
            System.out.print(value + " ");
        }

    }
  1. 结果
    在这里插入图片描述

修改源buffer中的数据,readonlyBuffer中的数据也被修改。或者说readonlyBuffer指向buffer的内存区域。


Buffer支持方法链写法

在这里插入图片描述


小结
  1. 只读的buffer是不能被修改的。
  2. buffer中容器装满后,不能继续装其他数据的。
  3. buffer与readonlyBuffer指向了同一个内存区域。
  4. Buffer支持链式写法。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值