版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
背景
无论是slice()方法还是asReadOnlyBuffer()方法,他们虽然会返回一个Buffer的具体实例,但是都是指向同一个内存区域。
slice 和 asReadOnlyBuffer
slice
- 测试代码
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() + " ");
}
}
- 结果
上图中高亮的,4,6,8,10就是修改的sliceBuffer中的内容,但是原来的buffer中的内容也被修改了,这说明他们指向同一个内存区域。
asReadOnlyBuffer
- 基本测试代码
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
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);
}
- 结果(抛出只读异常)
- 测试修改内容
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 + " ");
}
}
- 结果
修改源buffer中的数据,readonlyBuffer中的数据也被修改。或者说readonlyBuffer指向buffer的内存区域。
Buffer支持方法链写法
小结
- 只读的buffer是不能被修改的。
- buffer中容器装满后,不能继续装其他数据的。
- buffer与readonlyBuffer指向了同一个内存区域。
- Buffer支持链式写法。