`

Buffer源码解析

阅读更多
Buffer源码解析


Buffer的demo请看转载自:https://www.cnblogs.com/tankaixiong/p/3949421.html

/**
 * 一个特定基元类型数据的容器。
 * 缓冲器是一个特定的线性、有限的元素序列的原始类型。除了内容之外,。
 * 缓冲区的基本属性是其容量(capacity)、限制(limit)和位置(position)。
 *
 * capacity:缓冲区的容量是它包含的元素的数量。缓冲区的容量从不为负,也从不改变。
 * limit:缓冲区的limit是应该的第一个元素的索引。也从不为负,小于其capacity。
 * position:缓冲区的位置是下一个元素的索引。从不为负,小于它的limit。
 *
 * 每个非布尔基元类型都有这个类的一个子类。
 * 包括(ByteBuffer,CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer,DoubleBuffer)
 *
 * 这个类的每个子类定义了两个类别的get和put操作,
 * 
 * 缓冲区是线程不安全,可由多个并发线程使用。如果一个缓冲区将被多个线程使用,然后访问缓冲区。
 * 应该通过适当的同步来控制。
 * 
 */
public abstract class Buffer {

	//遍历和分割元素的spliterator的特性。保存在缓冲区
    static final int SPLITERATOR_CHARACTERISTICS =
        Spliterator.SIZED | Spliterator.SUBSIZED | Spliterator.ORDERED;

	//不变量:标记(mark) <= 位置(position) <= 极限(limit) <= 容量(capacity)。
    private int mark = -1;
    private int position = 0;
    private int limit;
    private int capacity;

    //仅由直接缓冲区使用
    //注意:在JNI GetDirectBufferAddress中提升速度。
    long address;

	//创建一个具有给定标记、位置、限制和容量的新缓冲区,检查后不变量。
    Buffer(int mark, int pos, int lim, int cap) {       
        if (cap < 0)
            throw new IllegalArgumentException("Negative capacity: " + cap);
        this.capacity = cap;
        limit(lim);
        position(pos);
        if (mark >= 0) {
            if (mark > pos)
                throw new IllegalArgumentException("mark > position: ("
                                                   + mark + " > " + pos + ")");
            this.mark = mark;
        }
    }

	//返回该缓冲区的容量
    public final int capacity() {
        return capacity;
    }

	//返回该缓冲区的位置
    public final int position() {
        return position;
    }

    /**
     * 设置此缓冲区的位置。如果标记被定义并且大于新的位置然后被丢弃
	 * 新位置:必须是非负数且不大于当前的限制
	 */
    public final Buffer position(int newPosition) {
        if ((newPosition > limit) || (newPosition < 0))
            throw new IllegalArgumentException();
        position = newPosition;
        if (mark > position) mark = -1;
        return this;
    }

	//返回该缓冲区的限制
    public final int limit() {
        return 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 mark() {
        mark = position;
        return this;
    }

	//将此缓冲区的位置重置为先前标记的位置。调用此方法既不更改也不丢弃标记的值
    public final Buffer reset() {
        int m = mark;
        if (m < 0)
            throw new InvalidMarkException();
        position = m;
        return this;
    }

	//清除缓存区,恢复默认值,将limit值定为capacity的值
    public final Buffer clear() {
        position = 0;
        limit = capacity;
        mark = -1;
        return this;
    }

	//重置缓存区,limit=position(上次写到的位置),position=0(重置为0)
	//也可以认为,是将Buffer的写模式,换成读模式,从数组起始处开始读
    public final Buffer flip() {
        limit = position;
        position = 0;
        mark = -1;
        return this;
    }
	
    public final Buffer rewind() {
        position = 0;
        mark = -1;
        return this;
    }

	//返回当前位置和限制之间的元素个数。
	//如果缓存区中的数据已经被全部读取完毕,limit-position=0
    public final int remaining() {
        return limit - position;
    }

	//说明当前位置和极限之间是否存在任何元素。若有,返回为true
    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();

}
分享到:
评论

相关推荐

    java 中Buffer源码的分析

    Java 中 Buffer 源码的分析 Java 中 Buffer 源码的分析是 Java 中一个非常重要的知识点, Buffer 是 Java 中用于高效进行 IO 操作的缓冲区。Buffer 分为两类:Direct Buffer 和 Heap Buffer。下面将详细介绍这两类 ...

    linux内核协议栈源码解析(2.6.18内核)

    《Linux内核协议栈源码解析(2.6.18内核)》是一本针对Linux内核网络协议栈深入解析的重要参考资料,尤其适合那些希望深入理解Linux内核以及网络通信机制的IT专业人士。该书详细阐述了Linux 2.6.18版本内核中的网络...

    Buffer操作大全

    2. `buffer.toString([encoding][, start][, end])`:将Buffer转换为字符串,根据encoding(默认'utf8')来解析。 3. `buffer.readUInt8(offset[, noAssert])`等:读取不同数据类型,如无符号整数、有符号整数、...

    netty源码解析视频

    ### Netty源码解析知识点概览 #### 一、Netty简介与应用场景 - **Netty**是一款由JBOSS提供的高性能的异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端。 - **应用场景**:Netty广泛...

    netty源码解析视频.txt

    ### Netty源码解析 #### 5. 核心组件源码解析 - **Bootstrap**:该类的构造函数和init方法是核心,它们负责配置Channel、EventLoopGroup以及其他必要的组件。 - **Channel**:主要关注其生命周期管理方法,如...

    Buffer读写模块源码

    本篇文章将深入探讨Buffer读写模块的源码,解析其工作原理和关键函数,帮助开发者更好地理解和利用Buffer进行数据操作。 Buffer的创建主要有三种方式:直接创建、通过长度创建以及从现有缓冲区复制。在源码中,这些...

    Pbc.rar_pbc_pull buffer_通信解析

    本文将基于"Pbc.rar_pbc_pull buffer_通信解析"的主题,深入探讨PBC(Protocol Buffer Compiler)库以及其在实现pull buffer通信解析中的应用。 PBC,全称Protocol Buffer Compiler,是由Google开发的一种序列化...

    Libevent源码解析.pdf

    Libevent 源码解析 Libevent 是一个高性能的事件驱动库,广泛应用于网络编程和高性能服务器开发中。下面是对 Libevent 源码的深入剖析,涵盖了其架构设计、事件处理机制、Reactor 模式、事件循环、IO multiplexing...

    Caffe源码深入解析

    ### Caffe源码深入解析 #### 一、概述 ##### 1.1 Caffe的优缺点 **优点:** - **高效性能:**Caffe基于Google Protocol Buffer数据标准设计,这种标准化的数据处理方式大大提升了其运行效率。尤其在深度学习模型...

    Buffer模块 修复bug源码

    在这个场景中,我们关注的是修复Buffer模块的bug源码。@wlp可能是贡献者或问题的报告者。下面,我们将深入探讨Buffer模块,理解其工作原理,并讨论可能遇到的常见问题以及如何修复它们。 Buffer模块是Node.js内建的...

    google protocal buffer 源代码,编译通过

    综上所述,"google protocal buffer 源代码,编译通过"意味着我们拥有了一个可以直接使用的、经过验证的 Protobuf 实现,可以深入研究其内部实现,进行自定义优化,或者为不支持的编程语言添加支持。这将极大地便利...

    MySQL核心参数含义的源码解析.pdf

    这份"MySQL核心参数含义的源码解析.pdf"文档详细介绍了MySQL数据库的关键参数及其背后的源码逻辑,帮助我们理解这些参数如何影响数据库的运行效率和性能。下面我们将深入探讨其中的一些重要参数及其工作机制。 1. *...

    InnoDB源码解析

    8. 关于InnoDB源码解析的工作方法 文档提出了一种解析InnoDB源码的方法,包括阅读C和C++源代码,用Ruby语言进行实现,并通过重构和校正使代码运行合理,最终进行文档化。这一过程有助于深入理解InnoDB的内部机制。 ...

    Netty源码解析1

    3. 学习NIO的基本概念,包括Selector、Channel和Buffer等。 4. 分析Netty的Channel、EventLoop、EventLoopGroup等核心组件,理解它们的角色和交互方式。 5. 研究编解码器,了解如何处理拆包和粘包问题。 6. 学习...

    z-buffer算法

    导入这个文件后,可以解析其内容,将其转换为计算机图形学可以理解的数据结构,并用这些数据来执行z-buffer算法进行渲染。 **实际应用** z-buffer算法常用于高级图形渲染引擎中,如游戏引擎和专业3D软件。通过结合...

    扫描线zbuffer

    在这个案例中,使用Java源码实现扫描线ZBuffer算法,开发者可能需要自行构建一个渲染管线,包括顶点坐标转换、投影、视口变换、以及ZBuffer操作等步骤。 1. **坐标转换**:首先,3D模型的顶点需要经过模型变换、...

    基于FFmpeg的内存播放器源码解析版本

    在“基于FFmpeg的内存播放器源码解析版本”中,我们主要探讨如何构建一个能够在内存中直接播放视频数据的播放器。这个项目名为"simplest_ffmpeg_mem_player",它提供了一个基础的实现,帮助开发者理解FFmpeg如何处理...

    易语言-Buffer读写模块

    在实际开发中,"Buffer读写模块源码"可以帮助程序员深入理解Buffer的工作原理,学习如何在易语言环境中进行高效的内存操作。通过研究源码,开发者可以学习到内存管理的最佳实践,进一步提升自己的编程能力。此外,...

    Buffer读写模块源码-易语言

    在这个“Buffer读写模块源码”中,我们将深入探讨易语言如何处理数据的读取和写入操作,以及修复读取文本的bug和新增长整数支持的相关知识点。 首先,Buffer模块通常用于内存缓冲区的操作,它在处理大量数据时能够...

Global site tag (gtag.js) - Google Analytics