`
默默的小熊
  • 浏览: 232821 次
社区版块
存档分类
最新评论

Buffer源码解读

 
阅读更多
public abstract class Buffer {

	private int mark = -1;
	private int position = 0;
	private int limit; // 缓冲区中第一个不能读或写的元素
	private int capacity;// 缓冲区中数据元素的最大容量

	long address;

	// 包似有的构造函数,用mark,pos,lim,cap初始化Buffer
	Buffer(int mark, int pos, int lim, int cap) {
		if (cap < 0)
			throw new IllegalArgumentException();
		this.capacity = cap;
		limit(lim);
		position(pos);
		if (mark >= 0) {
			if (mark > pos)
				throw new IllegalArgumentException();
			this.mark = mark;
		}
	}

	// 返回缓冲区中数据元素的最大容量
	public final int capacity() {
		return capacity;
	}

	// 返回缓冲区下一个要被读或写的元素的索引
	public final int position() {
		return position;
	}

	// 返回缓冲区中第一个不能读或写的元素
	public final int limit() {
		return limit;
	}

	// 做标记,把当前的pos位置记在mark中
	// 以后如果需要,可以通过调用reset()返回到当前位置
	public final Buffer mark() {
		mark = position;
		return this;
	}

	// 如果mark已被设置,把当前位置设为mark值
	// 当mark值没有被设置时,初始为1,抛出异常
	public final Buffer reset() {
		int m = mark;
		if (m < 0)
			throw new InvalidMarkException();
		position = m;
		return this;
	}

	// 设置缓冲区的下一个待读或写元素的新位置
	public final Buffer position(int newPosition) {
		if ((newPosition > limit) || (newPosition < 0))
			throw new IllegalArgumentException();
		position = newPosition;
		if (mark > position)
			mark = -1;
		return this;
	}

	// 设置limit
	public final Buffer limit(int newLimit) {
		if ((newLimit > capacity) || (newLimit < 0))
			throw new IllegalArgumentException();
		limit = newLimit;
		if (position > limit)
			position = limit;
		if (mark > limit)
			mark = -1;
		return this;
	}

	//
	public final Buffer clear() {
		position = 0;
		limit = capacity;
		mark = -1;
		return this;
	}

	// 在向缓冲区填数据时,可能填到一半,你希望不再写数据进去,而是希望
	// 读取该缓冲区里的数据,flip方法就是在你希望对缓冲区由写状态变成
	// 读状态时使用
	public final Buffer flip() {
		limit = position;
		position = 0;
		mark = -1;
		return this;
	}

	// 与flip类似
	public final Buffer rewind() {
		position = 0;
		mark = -1;
		return this;
	}

	// 返回当前位置和上界的差值
	public final int remaining() {
		return limit - position;
	}

	// 判断是否已经到达上界
	public final boolean hasRemaining() {
		return position < limit;
	}

	public abstract boolean isReadOnly();

	public abstract boolean hasArray();

	public abstract Object array();

	public abstract int arrayOffset();

	public abstract boolean isDirect();

	// -- Package-private methods for bounds checking, etc. --

	// 检查是否到达limit位置,如果没有,就pos++
	// 返回当前的位置
	final int nextGetIndex() { // package-private
		if (position >= limit)
			throw new BufferUnderflowException();
		return position++;
	}

	// 检查当前pos加上nb后是否会超过limit,超过抛出异常
	// 当前pos + = nb;
	// 返回当前位置
	final int nextGetIndex(int nb) { // package-private
		if (limit - position < nb)
			throw new BufferUnderflowException();
		int p = position;
		position += nb;
		return p;
	}

	final int nextPutIndex() { // package-private
		if (position >= limit)
			throw new BufferOverflowException();
		return position++;
	}

	final int nextPutIndex(int nb) { // package-private
		if (limit - position < nb)
			throw new BufferOverflowException();
		int p = position;
		position += nb;
		return p;
	}

	
	final int checkIndex(int i) { // package-private
		if ((i < 0) || (i >= limit))
			throw new IndexOutOfBoundsException();
		return i;
	}

	final int checkIndex(int i, int nb) { // package-private
		if ((i < 0) || (nb > limit - i))
			throw new IndexOutOfBoundsException();
		return i;
	}

	final int markValue() { // package-private
		return mark;
	}

	//.....
	static void checkBounds(int off, int len, int size) { // package-private
		if ((off | len | (off + len) | (size - (off + len))) < 0)
			throw new IndexOutOfBoundsException();
	}

}
 
分享到:
评论

相关推荐

    Netty5.0架构剖析和源码解读.pdf

    源码解读部分,可能会涉及到Netty的ChannelHandlerContext,它是处理事件的核心上下文对象,持有与Channel相关的所有信息,如Handler链、配置参数等。通过ChannelHandlerContext,开发者可以在Handler之间传递信息,...

    Netty5.0架构剖析和源码解读

    ### Netty5.0架构剖析和源码解读 #### 1. 概述 ##### 1.1. JAVA的IO演进 ###### 1.1.1. 传统BIO通信的弊端 在JDK 1.4之前,Java网络编程主要依赖于传统的同步阻塞I/O模型(BIO)。这一模型虽然简化了应用程序的...

    spring cloud ribbon源码解读

    Spring Cloud Ribbon源码解读 一、Ribbon初始化过程 Spring Cloud Ribbon的初始化过程涉及多个配置类,主要包括以下几个: 1. LoadBalancerAutoConfiguration:这个配置类负责注入Ribbon相关组件到Spring容器中,...

    java源码解读由浅入深.pdf

    ### Java源码解读之String类详解 #### 一、引言 在Java开发过程中,`String`类无疑是最常用的数据类型之一。它不仅在日常编码中频繁出现,也是面试中的热门话题。本文将深入探讨`String`类的核心实现机制及其重要...

    netty实战和源码解读-mini-netty.zip

    这个“netty实战和源码解读-mini-netty.zip”压缩包中的内容很可能是关于如何使用Netty进行实际开发以及深入理解Netty内部机制的教程或项目源码。"mini-netty-master"可能是一个简化版的Netty实现,用于教学或演示...

    13源码解读:Node 的程序架构及启动流程(1).md

    node原理讲解实例探究|1源码挖掘: Webpack 中用到 Node 的 10 个核心基础能力2案例一: [龟兔赛跑] Node 的语言基础 - JS(ES5[6[78)案例二: [视频时长统计] Node 的模块机制(CommonJS)与包管理|6案例五: ...

    mina 源码

    - **Buffer**: MINA提供了自定义的缓冲区类,如ByteBufferWrapper,用于高效地处理网络数据。 4. **MINA的使用场景** MINA广泛应用于各种网络服务,如HTTP服务器、FTP服务器、聊天服务器、游戏服务器等,尤其适用...

    网络驱动层封包截取系列源码.

    文件名称列表“14627143”可能是源码文件或相关文档的编号,具体的文件内容需要进一步查看才能详细解读。不过,从标题和描述来看,这份源码应该是关于网络驱动层封包截取的实践代码,对于学习网络编程、驱动开发以及...

    系统解析JDK源码,领略大牛设计思想,JAVA进阶必备(2023新课,已完结)

    8. **多线程同步**:synchronized关键字、Lock接口及其实现如ReentrantLock,以及并发工具类如Atomic系列,源码解读能揭示其内部同步机制,提升多线程编程能力。 9. **字符串处理**:String类的不可变性、...

    图形学实验八消隐(源码+文档)

    4. **源码结构**:源码部分会包含主程序、数据结构定义、渲染函数、输入处理等模块,通过阅读和理解这些代码,你可以学习到如何组织一个图形学项目。 5. **文档解读**:文档通常会解释实验的目的、步骤、实现原理和...

    arm64 linux luvcview 源码

    下面我们将从以下几个方面详细解读luvcview的源码: 1. **依赖库与配置**:luvcview依赖于libv4l2库,这是Video for Linux 2的一个接口库,提供了与V4L2内核模块通信的高级接口。在源码中,我们可以看到配置文件和...

    flink源码 类UML图

    《Flink源码分析:基于类UML图的深度解读》 Apache Flink是一个流行的开源流处理框架,它为实时数据处理提供了强大的支持。在深入理解Flink的内部工作机制时,类UML图是一种非常有效的工具,它可以帮助我们清晰地...

    java8源码-JavaRobot:Java学习笔记,JavaLearningNote

    源码解读 String源码系列 List源码系列 ArrayList LinkedList CopyOnWriteArrayList Vector Map源码系列 HashMap LinkedHashMap ConcurrentHashMap TreeMap Hashtable Set源码系列 HashSet LinkedHashSet TreeSet ...

    USB3.0设备端设计源代码详细解读

    ### USB3.0设备端设计源代码详细解读 #### 前言 随着技术的发展,USB3.0标准因其高速传输速率、低功耗以及更好的兼容性等特性,在电子行业中得到了广泛的应用。对于初次接触USB3.0设计的工程师而言,理解和掌握其...

    Mina2.0阅读源码笔记(很值得一看)

    1. **整体解读** - Mina 源码阅读通常采用自顶向下的方式,即先从整体结构入手,逐步深入细节。 - 阅读时应关注 Mina 的设计模式、架构原理及其核心组件之间的交互机制。 2. **IoBuffer 封装** - IoBuffer 的...

    Java网络高级编程源码人邮金勇华曲俊生

    8. **源码分析**:书中的“源码”部分,可能是对上述概念的实践代码进行详细解读,通过阅读和理解这些代码,读者可以加深对Java网络编程的理解,提升编程能力。 总之,《Java网络高级编程源码》这本书是Java开发者...

    基于Java的文件传输(LW+源码).zip

    "LW"可能是“轻量级”或者某种特定技术的缩写,但具体含义需要通过源码来解读。 首先,文件传输通常涉及到TCP/IP协议,Java提供了Socket编程接口,允许开发者构建基于网络的数据传输应用。在这个项目中,我们可能...

Global site tag (gtag.js) - Google Analytics