`

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源码的分析的相关资料,需要的朋友可以参考下

    易语言-Buffer读写模块

    Buffer读写模块源码

    滴水逆向3期作业Filebuffer-&gt;Imagebuffer-&gt;Newbuffer-&gt;存盘功能C++源码

    滴水逆向3期作业——filebuffer-&gt;imagebuffer-&gt;newbuffer-&gt;存盘功能源码,了解对文件的PE头解析等原理等,代码容易理解,注释丰富,是学习PE的好帮手!

    浅谈Linux磁盘修复e2fsck命令

    周末竟然去加班,原因是客户那里有一台服务器不能提供服务,经过排查是突然断电后可能产生了磁盘坏道导致,所以使用e2fsck命令进行了磁盘修复。 linux下磁盘检查修复命令e2fsck ...-F: 在检查前将硬盘的 buffer

    java源码包---java 源码 大量 实例

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM...

    Protocol Buffers 学习笔记

    NULL 博文链接:https://cherishlc.iteye.com/blog/2367689

    基于Django大数据农产品可视化分析系统(完整源码+1w数据集+数据建模分析).zip

    农产品数据分析及爬虫 # Create a boxplot using Seaborn and Matplotlib plt.figure(figsize=(8, 6)) sns.boxplot(y=df['最高价']) plt.title('Boxplot of...以下是代码的解析: 1.plt.figure(figsize=(8, 6)): 这行代

    通过nodejs将Excel转换成flatbuffer,并生成对应的描述解析文件(TypeScript)

    TS版本转配置代码参考 Excel 到 FlatBuffer

    JAVA上百实例源码以及开源项目源代码

    Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来...

    java源码包2

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    java源码包3

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    java源码包4

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...

    JAVA之hashmap源码分析-haha:已弃用的Java库可自动分析Android堆转储

    JAVA之hashmap源码分析 无头Android堆分析器 “哈哈!” -纳尔逊 此存储库已弃用 创建该项目的目的是通过重新打包其他存储库中的堆转储解析器来提供堆转储解析器。 LeakCanary现在有它自己的。 该解析器在Maven ...

    JAVA上百实例源码以及开源项目

    笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!此时此...

    微信IPAD 协议 微信接口 WeChatApi

    微信IPAD协议 7.1.0版本 支持个人微信号的操作 环境需求 .NET IIS Redis

    j2se项目源码及介绍_last指令

    在Unix系统中,有一个last指令可以查看用户登录服务器的历史记录,last指令的工作原理就是读取unix下的一个系统文件,解析然后输出的效果。 在今后的电信用户数据采集系统项目中,就是通过读取该系统文件来确定用户...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机...

    febird C++ 库(附带所有源码)

    febird 实现了一个序列化框架(对比boost.serializaiton/google.protocolbuffer),可以用在协议解析,大/小数据的序列化,有极高的性能(比boost.binary_archive快30~80倍),甚至对于非常小的对象,例如只有几个...

Global site tag (gtag.js) - Google Analytics