NIO与Socket笔记 : 复制缓冲区

ByteBuffer duplicate()方法的作用:创建共享此缓冲区内容的新的字节缓冲区 。

新缓 冲区的内容将为此缓冲区的内容 。 此缓冲区内容的更改在新缓冲区中是可见的,反之亦然 。

在创建新的缓冲区时,容量、限制、位置和标记的值将与此缓冲区相同,但是这两个缓冲区 的位置、界限和标记值是相互独立的 。 当且仅当此缓冲区为直接缓冲区时,新缓冲区才是直 接缓冲区 。

当且仅当 此缓冲区为只读时,新缓冲区才是只读的 。

使用 duplicate() 方法和 slice() 方法能创建新的 缓 冲 区 ,但这些新缓冲区使用的还是原 来缓冲区中 的 byte[] 字节数组。

下面验证使用 duplicate()方法创建新的缓冲区后,在新缓冲区中添加数据时,被复制的 缓 冲区中的值也发生改变,说明这两个缓冲区用的是同 一个 byte[],代码如下 :


import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;

public class BufferTest06 {

    public static void main(String[] args) throws UnsupportedEncodingException {

        byte[] byteArrayinl = { 1, 2, 3, 4, 5 };

        ByteBuffer bytebuffer1 = ByteBuffer.wrap(byteArrayinl) ;
        ByteBuffer bytebuffer2 = bytebuffer1.duplicate() ;

        System.out.println( "A capacity=" + bytebuffer1.capacity() + "position=" + bytebuffer1.position() + " limit= " + bytebuffer1 .limit());

        System.out.println( "A capacity=" + bytebuffer2.capacity() + "position=" + bytebuffer2.position() + " limit= " + bytebuffer2 .limit());


        bytebuffer2.put(1, (byte ) 222) ;
        bytebuffer2 .position(3) ;


        System.out.println( "A capacity=" + bytebuffer1.capacity() + "position=" + bytebuffer1.position() + " limit= " + bytebuffer1 .limit());

        System.out.println( "A capacity=" + bytebuffer2.capacity() + "position=" + bytebuffer2.position() + " limit= " + bytebuffer2 .limit());


        bytebuffer1.position(0);

        for (int i =0 ; i < bytebuffer1.limit(); i++) {
            System.out.print(bytebuffer1.get(i) + "  ");
        }

        System.out.println( "  ");
        System.out.println( " =========================================================  ");
        bytebuffer2.position(0);

        for (int i =0 ; i < bytebuffer2.limit(); i++) {
            System.out.print(bytebuffer1.get(i) + "  ");
        }

    }
}

输出结果:

Connected to the target VM, address: '127.0.0.1:58980', transport: 'socket'
A capacity=5position=0 limit= 5
A capacity=5position=0 limit= 5
A capacity=5position=0 limit= 5
A capacity=5position=3 limit= 5
1  -34  3  4  5    
 =========================================================  
1  -34  3  4  5  Disconnected from the target VM, address: '127.0.0.1:58980', transport: 'socket'

Process finished with exit code 0
 

结论:

使用的是同一个数组,更改一个里面的值,另外一个也跟着改变.

但是这两个引用的指针是两套独立的系统.

猜你喜欢

转载自blog.csdn.net/zhanglong_4444/article/details/88953748