java nio ByteBufferAsCharBufferB/L源码分析

目录

简介

ByteBufferAsCharBufferB

ByteBufferAsCharBufferL


简介

ByteBufferAsCharBufferB,内部含有一个ByteBuffer和offset。

进行get和put操作时,调用ix(position),ix方法返回的是(i << 1) + offset,对应了ByteBuffer里对应的索引。操作时,调用Bits.get/putCharB,从而进行操作。

ByteBufferAsCharBufferB和ByteBufferAsCharBufferL的区别是,一个调用Bits.get/putCharB,一个调用Bits.get/putCharL

ByteBufferAsCharBufferB


package java.nio;

class ByteBufferAsCharBufferB // package-private
		extends CharBuffer {

	protected final ByteBuffer bb;
	protected final int offset;

	ByteBufferAsCharBufferB(ByteBuffer bb) { // package-private

		super(-1, 0, bb.remaining() >> 1, bb.remaining() >> 1);
		this.bb = bb;
		// enforce limit == capacity
		int cap = this.capacity();
		this.limit(cap);
		int pos = this.position();
		assert (pos <= cap);
		offset = pos;

	}

	ByteBufferAsCharBufferB(ByteBuffer bb, int mark, int pos, int lim, int cap, int off) {

		super(mark, pos, lim, cap);
		this.bb = bb;
		offset = off;

	}

	public CharBuffer slice() {
		int pos = this.position();
		int lim = this.limit();
		assert (pos <= lim);
		int rem = (pos <= lim ? lim - pos : 0);
		int off = (pos << 1) + offset;
		assert (off >= 0);
		return new ByteBufferAsCharBufferB(bb, -1, 0, rem, rem, off);
	}

	public CharBuffer duplicate() {
		return new ByteBufferAsCharBufferB(bb, this.markValue(), this.position(), this.limit(), this.capacity(),
				offset);
	}

	public CharBuffer asReadOnlyBuffer() {

		return new ByteBufferAsCharBufferRB(bb, this.markValue(), this.position(), this.limit(), this.capacity(),
				offset);

	}

	protected int ix(int i) {
		return (i << 1) + offset;
	}

	public char get() {
		return Bits.getCharB(bb, ix(nextGetIndex()));
	}

	public char get(int i) {
		return Bits.getCharB(bb, ix(checkIndex(i)));
	}

	char getUnchecked(int i) {
		return Bits.getCharB(bb, ix(i));
	}

	public CharBuffer put(char x) {

		Bits.putCharB(bb, ix(nextPutIndex()), x);
		return this;

	}

	public CharBuffer put(int i, char x) {

		Bits.putCharB(bb, ix(checkIndex(i)), x);
		return this;

	}

	public CharBuffer compact() {

		int pos = position();
		int lim = limit();
		assert (pos <= lim);
		int rem = (pos <= lim ? lim - pos : 0);

		ByteBuffer db = bb.duplicate();
		db.limit(ix(lim));
		db.position(ix(0));
		ByteBuffer sb = db.slice();
		sb.position(pos << 1);
		sb.compact();
		position(rem);
		limit(capacity());
		discardMark();
		return this;

	}

	public boolean isDirect() {
		return bb.isDirect();
	}

	public boolean isReadOnly() {
		return false;
	}

	public String toString(int start, int end) {
		if ((end > limit()) || (start > end))
			throw new IndexOutOfBoundsException();
		try {
			int len = end - start;
			char[] ca = new char[len];
			CharBuffer cb = CharBuffer.wrap(ca);
			CharBuffer db = this.duplicate();
			db.position(start);
			db.limit(end);
			cb.put(db);
			return new String(ca);
		} catch (StringIndexOutOfBoundsException x) {
			throw new IndexOutOfBoundsException();
		}
	}

	// --- Methods to support CharSequence ---

	public CharBuffer subSequence(int start, int end) {
		int pos = position();
		int lim = limit();
		assert (pos <= lim);
		pos = (pos <= lim ? pos : lim);
		int len = lim - pos;

		if ((start < 0) || (end > len) || (start > end))
			throw new IndexOutOfBoundsException();
		return new ByteBufferAsCharBufferB(bb, -1, pos + start, pos + end, capacity(), offset);
	}

	public ByteOrder order() {

		return ByteOrder.BIG_ENDIAN;

	}

}

ByteBufferAsCharBufferL


package java.nio;

class ByteBufferAsCharBufferL // package-private
		extends CharBuffer {

	protected final ByteBuffer bb;
	protected final int offset;

	ByteBufferAsCharBufferL(ByteBuffer bb) { // package-private

		super(-1, 0, bb.remaining() >> 1, bb.remaining() >> 1);
		this.bb = bb;
		// enforce limit == capacity
		int cap = this.capacity();
		this.limit(cap);
		int pos = this.position();
		assert (pos <= cap);
		offset = pos;

	}

	ByteBufferAsCharBufferL(ByteBuffer bb, int mark, int pos, int lim, int cap, int off) {

		super(mark, pos, lim, cap);
		this.bb = bb;
		offset = off;

	}

	public CharBuffer slice() {
		int pos = this.position();
		int lim = this.limit();
		assert (pos <= lim);
		int rem = (pos <= lim ? lim - pos : 0);
		int off = (pos << 1) + offset;
		assert (off >= 0);
		return new ByteBufferAsCharBufferL(bb, -1, 0, rem, rem, off);
	}

	public CharBuffer duplicate() {
		return new ByteBufferAsCharBufferL(bb, this.markValue(), this.position(), this.limit(), this.capacity(),
				offset);
	}

	public CharBuffer asReadOnlyBuffer() {

		return new ByteBufferAsCharBufferRL(bb, this.markValue(), this.position(), this.limit(), this.capacity(),
				offset);

	}

	protected int ix(int i) {
		return (i << 1) + offset;
	}

	public char get() {
		return Bits.getCharL(bb, ix(nextGetIndex()));
	}

	public char get(int i) {
		return Bits.getCharL(bb, ix(checkIndex(i)));
	}

	char getUnchecked(int i) {
		return Bits.getCharL(bb, ix(i));
	}

	public CharBuffer put(char x) {

		Bits.putCharL(bb, ix(nextPutIndex()), x);
		return this;

	}

	public CharBuffer put(int i, char x) {

		Bits.putCharL(bb, ix(checkIndex(i)), x);
		return this;

	}

	public CharBuffer compact() {

		int pos = position();
		int lim = limit();
		assert (pos <= lim);
		int rem = (pos <= lim ? lim - pos : 0);

		ByteBuffer db = bb.duplicate();
		db.limit(ix(lim));
		db.position(ix(0));
		ByteBuffer sb = db.slice();
		sb.position(pos << 1);
		sb.compact();
		position(rem);
		limit(capacity());
		discardMark();
		return this;

	}

	public boolean isDirect() {
		return bb.isDirect();
	}

	public boolean isReadOnly() {
		return false;
	}

	public String toString(int start, int end) {
		if ((end > limit()) || (start > end))
			throw new IndexOutOfBoundsException();
		try {
			int len = end - start;
			char[] ca = new char[len];
			CharBuffer cb = CharBuffer.wrap(ca);
			CharBuffer db = this.duplicate();
			db.position(start);
			db.limit(end);
			cb.put(db);
			return new String(ca);
		} catch (StringIndexOutOfBoundsException x) {
			throw new IndexOutOfBoundsException();
		}
	}

	// --- Methods to support CharSequence ---

	public CharBuffer subSequence(int start, int end) {
		int pos = position();
		int lim = limit();
		assert (pos <= lim);
		pos = (pos <= lim ? pos : lim);
		int len = lim - pos;

		if ((start < 0) || (end > len) || (start > end))
			throw new IndexOutOfBoundsException();
		return new ByteBufferAsCharBufferL(bb, -1, pos + start, pos + end, capacity(), offset);
	}

	public ByteOrder order() {

		return ByteOrder.LITTLE_ENDIAN;

	}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值