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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/outsanding/article/details/102665029
背景

无论是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支持链式写法。

猜你喜欢

转载自blog.csdn.net/outsanding/article/details/102665029