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();
}
}
分享到:
相关推荐
源码解读部分,可能会涉及到Netty的ChannelHandlerContext,它是处理事件的核心上下文对象,持有与Channel相关的所有信息,如Handler链、配置参数等。通过ChannelHandlerContext,开发者可以在Handler之间传递信息,...
### Netty5.0架构剖析和源码解读 #### 1. 概述 ##### 1.1. JAVA的IO演进 ###### 1.1.1. 传统BIO通信的弊端 在JDK 1.4之前,Java网络编程主要依赖于传统的同步阻塞I/O模型(BIO)。这一模型虽然简化了应用程序的...
Spring Cloud Ribbon源码解读 一、Ribbon初始化过程 Spring Cloud Ribbon的初始化过程涉及多个配置类,主要包括以下几个: 1. LoadBalancerAutoConfiguration:这个配置类负责注入Ribbon相关组件到Spring容器中,...
### Java源码解读之String类详解 #### 一、引言 在Java开发过程中,`String`类无疑是最常用的数据类型之一。它不仅在日常编码中频繁出现,也是面试中的热门话题。本文将深入探讨`String`类的核心实现机制及其重要...
这个“netty实战和源码解读-mini-netty.zip”压缩包中的内容很可能是关于如何使用Netty进行实际开发以及深入理解Netty内部机制的教程或项目源码。"mini-netty-master"可能是一个简化版的Netty实现,用于教学或演示...
node原理讲解实例探究|1源码挖掘: Webpack 中用到 Node 的 10 个核心基础能力2案例一: [龟兔赛跑] Node 的语言基础 - JS(ES5[6[78)案例二: [视频时长统计] Node 的模块机制(CommonJS)与包管理|6案例五: ...
- **Buffer**: MINA提供了自定义的缓冲区类,如ByteBufferWrapper,用于高效地处理网络数据。 4. **MINA的使用场景** MINA广泛应用于各种网络服务,如HTTP服务器、FTP服务器、聊天服务器、游戏服务器等,尤其适用...
文件名称列表“14627143”可能是源码文件或相关文档的编号,具体的文件内容需要进一步查看才能详细解读。不过,从标题和描述来看,这份源码应该是关于网络驱动层封包截取的实践代码,对于学习网络编程、驱动开发以及...
8. **多线程同步**:synchronized关键字、Lock接口及其实现如ReentrantLock,以及并发工具类如Atomic系列,源码解读能揭示其内部同步机制,提升多线程编程能力。 9. **字符串处理**:String类的不可变性、...
4. **源码结构**:源码部分会包含主程序、数据结构定义、渲染函数、输入处理等模块,通过阅读和理解这些代码,你可以学习到如何组织一个图形学项目。 5. **文档解读**:文档通常会解释实验的目的、步骤、实现原理和...
下面我们将从以下几个方面详细解读luvcview的源码: 1. **依赖库与配置**:luvcview依赖于libv4l2库,这是Video for Linux 2的一个接口库,提供了与V4L2内核模块通信的高级接口。在源码中,我们可以看到配置文件和...
《Flink源码分析:基于类UML图的深度解读》 Apache Flink是一个流行的开源流处理框架,它为实时数据处理提供了强大的支持。在深入理解Flink的内部工作机制时,类UML图是一种非常有效的工具,它可以帮助我们清晰地...
源码解读 String源码系列 List源码系列 ArrayList LinkedList CopyOnWriteArrayList Vector Map源码系列 HashMap LinkedHashMap ConcurrentHashMap TreeMap Hashtable Set源码系列 HashSet LinkedHashSet TreeSet ...
### USB3.0设备端设计源代码详细解读 #### 前言 随着技术的发展,USB3.0标准因其高速传输速率、低功耗以及更好的兼容性等特性,在电子行业中得到了广泛的应用。对于初次接触USB3.0设计的工程师而言,理解和掌握其...
1. **整体解读** - Mina 源码阅读通常采用自顶向下的方式,即先从整体结构入手,逐步深入细节。 - 阅读时应关注 Mina 的设计模式、架构原理及其核心组件之间的交互机制。 2. **IoBuffer 封装** - IoBuffer 的...
8. **源码分析**:书中的“源码”部分,可能是对上述概念的实践代码进行详细解读,通过阅读和理解这些代码,读者可以加深对Java网络编程的理解,提升编程能力。 总之,《Java网络高级编程源码》这本书是Java开发者...
"LW"可能是“轻量级”或者某种特定技术的缩写,但具体含义需要通过源码来解读。 首先,文件传输通常涉及到TCP/IP协议,Java提供了Socket编程接口,允许开发者构建基于网络的数据传输应用。在这个项目中,我们可能...