文档章节

java.nio.Buffer源码解读

A__17
 A__17
发布于 2017/08/21 23:00
字数 492
阅读 3
收藏 0
点赞 0
评论 0

版本:JDK7

package java.nio;

public abstract class Buffer {

// mark <= position <= limit <= capacity
private int mark = -1;		// 标记,一个特定的position,通过mark()方法指定Buffer中的标记,之后可以通过reset()方法恢复到这个索引位置
private int position = 0;	// 下一个要读取或写入的数据的索引
private int limit;			// 界限,表示缓冲区中可操作数据的大小,索引等于和大于limit的数据不能进行读写。
private int capacity;		// 缓冲区的容量,创建后不能修改。

// Used only by direct buffers
// NOTE: hoisted here for speed in JNI GetDirectBufferAddress
long address;

// Creates a new buffer with the given mark, position, limit, and capacity,
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;
}

// 重新设置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;
}

// 重新设置limit的值:如果新limit小于position,则将position设为新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;
}

// 将position的值设置为mark
public final Buffer reset() {
    int m = mark;
    if (m < 0)
        throw new InvalidMarkException();
    position = m;
    return this;
}

// 清空缓冲区:Buffer的属性恢复到初始化状态。注意:此时缓冲区中的数据仍然存在。
public final Buffer clear() {
    position = 0;
    limit = capacity;
    mark = -1;
    return this;
}

// 将limit设为当前的position,之后将position重置为0
public final Buffer flip() {
    limit = position;
    position = 0;
    mark = -1;
    return this;
}

// 将position设为0,并取消设置的标记:即重新读Buffer
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. --
// ...

}

© 著作权归作者所有

共有 人打赏支持
A__17
粉丝 2
博文 91
码字总数 101178
作品 0
朝阳
Java NIO ByteBuffer学习

深入理解Apache Mina (6)---- Java Nio ByteBuffer与Mina ByteBuffer的区别 http://chinaestone.iteye.com/blog/468138 DirectBuffer及内存泄漏 http://blog.csdn.net/zhouhl_cn/article/d......

mj4738 ⋅ 2012/10/15 ⋅ 0

Android6.0源码解读之Activity点击事件分发机制

本篇博文是Android点击事件分发机制系列博文的第四篇,主要是从解读Activity类的源码入手,根据源码理清Activity点击事件分发原理,并掌握Activity点击事件分法机制。特别声明的是,本源码解...

mynameishuangshuai ⋅ 2016/10/23 ⋅ 0

Android6.0源码解读之View点击事件分发机制

本篇博文是Android点击事件分发机制系列博文的第二篇,主要是从解读View类的源码入手,根据源码理清View点击事件分发原理,并掌握View点击事件分法机制。特别声明的是,本源码解读是基于最新...

mynameishuangshuai ⋅ 2016/10/23 ⋅ 0

升级到JDK9的一个BUG,你了解吗

概述 前几天在一个群里看到一个朋友发了一个demo,说是JDK的bug,昨天在JVM的一个群里又有朋友发了,觉得挺有意思,分享给大家,希望大家升级JDK的版本的时候注意下是否存在这样的代码,如果...

你假笨 ⋅ 06/06 ⋅ 0

Android6.0触摸事件分发机制解读

本篇博文是Android触摸事件分发机制系列博文的第一篇,带领大家从全局掌握Android触摸事件分发机制。特别声明的是,本源码解读是基于最新的Android6.0版本。 (一)Android6.0源码解读之Vie...

mynameishuangshuai ⋅ 2016/10/24 ⋅ 0

java.nio.Buffer缓冲区源码解析

1.Buffer缓冲区的原理图 2.常用的变量 //临时备忘位置变量 /** * 在写模式下,position从0开始写,一直可以写到capacity-1。 * 在读模式下,position从某个位置去读,如果从写切换到读,那么...

ya_1249463314 ⋅ 01/30 ⋅ 0

关于Birt source的讨论和疑问

最近遇到一个头疼的问题,客户需求使用Myriad-Italic字体显示某些栏位,在模板中设出来以后,并不能正确显示,而是显示成Myriad,也就是说没有斜体。 为什么不能显示成Myriad-Italic呢?这个...

aine_pan ⋅ 2012/09/24 ⋅ 0

Mina系列文章索引

写了很多关于Apache Mina的文章,为了方便大家阅读,我将关于mina的一些文章做点儿索引。 Mina官网资料----------------------------------------------------------------- Mina官网是学习m...

Gaischen ⋅ 2012/11/28 ⋅ 15

Android6.0源码解读之ViewGroup点击事件分发机制

本篇博文是Android点击事件分发机制系列博文的第三篇,主要是从解读ViewGroup类的源码入手,根据源码理清ViewGroup点击事件分发原理,明白ViewGroup和View点击事件分发的关系,并掌握ViewGro...

mynameishuangshuai ⋅ 2016/10/24 ⋅ 0

Yolo的卷积运算源码图解之im2col.c

yolo卷积源码解读找了好久,但网上好多的解读,有点误人子弟, 之前还找到一片注释写的比源代码还多几倍的,以为我就这样看懂了? 不存在的 QWQ,后来直接自己看懂了源码,却看不懂了注释 于是有了下...

蜜丝特潮 ⋅ 05/12 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

645. Set Mismatch - LeetCode

Question 645. Set Mismatch Solution 思路: 遍历每个数字,然后将其应该出现的位置上的数字变为其相反数,这样如果我们再变为其相反数之前已经成负数了,说明该数字是重复数,将其将入结果r...

yysue ⋅ 26分钟前 ⋅ 0

Confluence 6 从生产环境中恢复一个测试实例

请参考 Restoring a Test Instance from Production 页面中的内容获得更多完整的说明。 很多 Confluence 的管理员将会使用生产实例运行完整数据和服务的 Confluence 服务器,同时还会设置一个...

honeymose ⋅ 30分钟前 ⋅ 0

Python这么强?红包杀手、消息撤回也可以无视,手机App辅助!

论述 标题也许有点不好理解,其实就是一款利用Python实现的可以监控微信APP内的红包与消息撤回的助手。不得不说,这确实是一款大家钟意的神器。 消息撤回是一件很让人恶心的事,毕竟人都是有...

Python燕大侠 ⋅ 41分钟前 ⋅ 0

压缩打包介绍、gzip压缩工具、bzip2压缩工具、xz压缩工具

压缩打包介绍 压缩的好处不仅能节省磁盘空间而且在传输的时候节省传输时间和网络带宽 windows系统下文件带有 .rar .zip .7z 后缀的就是压缩文件 linux系统下则是 .zip, .gz, .bz2, .xz, ...

黄昏残影 ⋅ 46分钟前 ⋅ 0

观察者模式

1.利用java原生类进行操作 package observer;import java.util.Observable;import java.util.Observer;/** * @author shadow * @Date 2016年8月12日下午7:29:31 * @Fun 观察目标 **/......

Cobbage ⋅ 49分钟前 ⋅ 0

Ubuntu打印服务器配置

参考:https://blog.csdn.net/gsls200808/article/details/50950586 https://blog.csdn.net/jiay2/article/details/80252369 https://wiki.gentoo.org/wiki/HPLIP 由于媳妇儿要大量打印资料,......

大熊猫 ⋅ 55分钟前 ⋅ 0

面试的角度诠释Java工程师(二)

原文出处: locality 续言: 相信每一位简书的作者,都会有我这样的思考:怎么写好一篇文章?或者怎么写好一篇技术类的文章?我就先说说我的感悟吧,写文章其实和写程序是一样的。为什么我会...

颖伙虫 ⋅ 57分钟前 ⋅ 0

github中SSH的Key

https://help.github.com/articles/connecting-to-github-with-ssh/ https://help.github.com/articles/testing-your-ssh-connection/ https://help.github.com/articles/adding-a-new-ssh-k......

whoisliang ⋅ 58分钟前 ⋅ 0

only_full_group_by

我的mysql是在CentOS7.1下面的5.7.17 在 /etc/my.cnf 文件里加上如下: sql_mode='NO_ENGINE_SUBSTITUTION' 然后,重启Mysql服务 systemctl restart mysqld...

SunHacker ⋅ 今天 ⋅ 0

实际项目(SpringBoot项目)中集成Druid

参考网页 https://blog.csdn.net/liuchuanhong1/article/details/55050131 https://blog.csdn.net/CoffeeAndIce/article/details/78707819 https://www.pocketdigi.com/20170530/1577.html 为......

karma123 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部