当一个管理其他缓冲区所包含的数据元素的缓冲区被创建时,这个缓冲区被称为视图缓冲区。
大多说的视图缓冲区都是ByteBuffer的视图。
本章节的“复制缓冲区”和下一个章节将要讲解的“视图缓冲区”很有联系,我们要注意。
本章节我们还是以CharBuffer为例,先介绍CharBuffer类中定义的几个复制缓冲区的方法:
public abstract CharBuffer asReadOnlyBuffer()创建共享此缓冲区内容的新的只读字符缓冲区。
新缓冲区的内容将为此缓冲区的内容。此缓冲区的更改在新缓冲区中是可见的,但新缓冲区将是只读的并且不允许修改共享内容。两个缓冲区的位置、界限和标记值是相互独立。
新缓冲区的容量、界限、位置和标记值将与此缓冲区相同。
如果此缓冲区本身是只读的,则此方法与 duplicate 方法完全相同。
返回:
新的只读字符缓冲区
生成一个只读的缓冲区视图,与duplicate相同,除了这个新的缓冲区不容许使用put,且其isReadOnly()函数将返回true。
public abstract CharBuffer duplicate()创建共享此缓冲区内容的新的字符缓冲区。
新缓冲区的内容将为此缓冲区的内容。此缓冲区内容的更改在新缓冲区中是可见的,反之亦然;这两个缓冲区的位置、界限和标记值是相互独立的。
新缓冲区的容量、界限、位置和标记值将与此缓冲区相同。当且仅当此缓冲区为直接时,新缓冲区才是直接的,当且仅当此缓冲区为只读时,新缓冲区才是只读的。
返回:
新的字符缓冲区
duplicate创建了一个和原始缓冲区相似的新缓冲区。两个缓冲区共享数据元素,拥有同样的容量(c),但每个缓冲区拥有各自的位置(p),上界(l)和标记属性(m)。
对一个缓冲区内的数据元素所做的改变会放映在另一个缓冲区中。视图缓冲区会继承原始缓冲区:只读、直接属性。
CharBuffer charBuffer=CharBuffer.allocate(8);
charBuffer.position(3).limit(6).mark().position(5);
CharBuffer dupeBuffer=charBuffer.duplicate();
dupeBuffer.clear();
public abstract CharBuffer slice()创建新的字符缓冲区,其内容为此缓冲区内容的共享子序列。
新缓冲区的内容将从此缓冲区的当前位置开始。此缓冲区内容的更改在新缓冲区中是可见的,反之亦然;这两个缓冲区的位置、界限和标记值是相互独立的。
新缓冲区的位置将为零,其容量和界限将为此缓冲区中所剩余的字符数量,其标记是未定义的。当且仅当此缓冲区为直接时,新缓冲区才是直接的,当且仅当此缓冲区为只读时,新缓冲区才是只读的。
返回:
新的字符缓冲区
char[] myBuffer=new char[100];
CharBuffer cb=CharBuffer.wrap(myBuffer);
cb.position(12).limit(21);
CharBuffer sliced=cb.slice();