package java.nio;
/**
*
*
*
* 一个只读HeapByteBuffer。
* 这个类扩展了相应的read/write类,
* 覆盖了修改方法(各种put和putXXX),以抛出一个ReadOnlyBufferException,
* 覆盖了view-buffer方法以返回这个类的实例而不是超类的实例。
*
*/
class HeapByteBufferR extends HeapByteBuffer {
// For speed these fields are actually declared in X-Buffer;
// these declarations are here as documentation
/*
*/
// 3个构造函数内,isReadOnly为true
HeapByteBufferR(int cap, int lim) { // package-private
super(cap, lim);
this.isReadOnly = true;
}
HeapByteBufferR(byte[] buf, int off, int len) { // package-private
super(buf, off, len);
this.isReadOnly = true;
}
protected HeapByteBufferR(byte[] buf, int mark, int pos, int lim, int cap, int off) {
super(buf, mark, pos, lim, cap, off);
this.isReadOnly = true;
}
// 都返回的是HeapByteBufferR,而不是HeapByteBuffer
public ByteBuffer slice() {
return new HeapByteBufferR(hb, -1, 0, this.remaining(), this.remaining(), this.position() + offset);
}
public ByteBuffer duplicate() {
return new HeapByteBufferR(hb, this.markValue(), this.position(), this.limit(), this.capacity(), offset);
}
public ByteBuffer asReadOnlyBuffer() {
return duplicate();
}
// 这个方法返回true
public boolean isReadOnly() {
return true;
}
// 各种put方法抛出异常
public ByteBuffer put(byte x) {
throw new ReadOnlyBufferException();
}
public ByteBuffer put(int i, byte x) {
throw new ReadOnlyBufferException();
}
public ByteBuffer put(byte[] src, int offset, int length) {
throw new ReadOnlyBufferException();
}
public ByteBuffer put(ByteBuffer src) {
throw new ReadOnlyBufferException();
}
public ByteBuffer compact() {
throw new ReadOnlyBufferException();
}
byte _get(int i) { // package-private
return hb[i];
}
void _put(int i, byte b) { // package-private
throw new ReadOnlyBufferException();
}
// char
public ByteBuffer putChar(char x) {
throw new ReadOnlyBufferException();
}
public ByteBuffer putChar(int i, char x) {
throw new ReadOnlyBufferException();
}
// 返回的是ByteBufferAsCharBuffer RB 或者RL ,原来返回的是B和L
public CharBuffer asCharBuffer() {
int size = this.remaining() >> 1;
int off = offset + position();
return (bigEndian ? (CharBuffer) (new ByteBufferAsCharBufferRB(this, -1, 0, size, size, off))
: (CharBuffer) (new ByteBufferAsCharBufferRL(this, -1, 0, size, size, off)));
}
// short
public ByteBuffer putShort(short x) {
throw new ReadOnlyBufferException();
}
public ByteBuffer putShort(int i, short x) {
throw new ReadOnlyBufferException();
}
public ShortBuffer asShortBuffer() {
int size = this.remaining() >> 1;
int off = offset + position();
return (bigEndian ? (ShortBuffer) (new ByteBufferAsShortBufferRB(this, -1, 0, size, size, off))
: (ShortBuffer) (new ByteBufferAsShortBufferRL(this, -1, 0, size, size, off)));
}
// int
public ByteBuffer putInt(int x) {
throw new ReadOnlyBufferException();
}
public ByteBuffer putInt(int i, int x) {
throw new ReadOnlyBufferException();
}
public IntBuffer asIntBuffer() {
int size = this.remaining() >> 2;
int off = offset + position();
return (bigEndian ? (IntBuffer) (new ByteBufferAsIntBufferRB(this, -1, 0, size, size, off))
: (IntBuffer) (new ByteBufferAsIntBufferRL(this, -1, 0, size, size, off)));
}
// long
public ByteBuffer putLong(long x) {
throw new ReadOnlyBufferException();
}
public ByteBuffer putLong(int i, long x) {
throw new ReadOnlyBufferException();
}
public LongBuffer asLongBuffer() {
int size = this.remaining() >> 3;
int off = offset + position();
return (bigEndian ? (LongBuffer) (new ByteBufferAsLongBufferRB(this, -1, 0, size, size, off))
: (LongBuffer) (new ByteBufferAsLongBufferRL(this, -1, 0, size, size, off)));
}
// float
public ByteBuffer putFloat(float x) {
throw new ReadOnlyBufferException();
}
public ByteBuffer putFloat(int i, float x) {
throw new ReadOnlyBufferException();
}
public FloatBuffer asFloatBuffer() {
int size = this.remaining() >> 2;
int off = offset + position();
return (bigEndian ? (FloatBuffer) (new ByteBufferAsFloatBufferRB(this, -1, 0, size, size, off))
: (FloatBuffer) (new ByteBufferAsFloatBufferRL(this, -1, 0, size, size, off)));
}
// double
public ByteBuffer putDouble(double x) {
throw new ReadOnlyBufferException();
}
public ByteBuffer putDouble(int i, double x) {
throw new ReadOnlyBufferException();
}
public DoubleBuffer asDoubleBuffer() {
int size = this.remaining() >> 3;
int off = offset + position();
return (bigEndian ? (DoubleBuffer) (new ByteBufferAsDoubleBufferRB(this, -1, 0, size, size, off))
: (DoubleBuffer) (new ByteBufferAsDoubleBufferRL(this, -1, 0, size, size, off)));
}
}