JDK 源码学习——ByteBuffer
ByteBuffer 在NIO的作用
Java SE4 开始引入Java NIO,相比较于老的IO,更加依赖底层实现。引入通道(Channels),选择器(selector),缓冲(Buffers).都更加接近操作系统执行I/O的方式.所以速度更快。
NIO 是非阻塞IO,非阻塞IO的实现是基于事件的,选择器定义了一个IO通道,程序继续运行。选择器上发生事件时,会唤醒选择器并执行相应动作。IO是阻塞IO,面向流操作,顺序读写,对于小文件序列化的读写有优势。nio是面向缓冲器,对数据的偏移支持比较好。
本文提到的ByteBuffer就是缓冲器,负责与通道进行数据交换。缓冲器总共有ByteBuffer,CharBuffer,DoubleBuffer,FloatBuffer,IntBuffer,LongBuffer,ShortBuffer.
ByteBuffer的重要属性
Buffer 基类
属性
缓冲器都继承了Buffer类,Buffer是一个固定大小的数据容器。除了存储内容之外,还有三个重要的属性。
capacity buffer中元素总数
position 写模式下就是下一个元素的index,读模式就是当前元素index
limit 是不应该被读/写的第一个元素index。写模式时就是capacity,读模式则是下一个元素的index.如下图:图片来自http://javapapers.com/java/java-nio-buffer/
方法
- flip
一般是切换到读操作。或者是为写操作准备一个新的序列
public final Buffer flip() {
limit = position;
position = 0;
mark = -1;
return this;
}
eg.重复向一个ByteBuffer写数据的时候,赋值完毕,必须要flip.开始一个新的新序列,否则position会等于limit,返回空值
public static void main(String[] args) {
byte[] bytes1=new byte[]{1, 6, 3};
ByteBuffer buffer =fromByteArray(bytes1);
System.out.println(buffer);
byte[] bytes2 =new byte[]{1,2,3};
ByteBuffer buffer2=fromByteArray(bytes2);
System.out.println(buffer2);
}
/**
* If you are building up a ByteBuffer by repeatedly writing into it, and then want to give it away, you must remember to flip() it.
* If we did not flip() it, the returned ByteBuffer would be empty because the position would be equal to the limit.
* @param bytes
* @return
*/
public static ByteBuffer fromByteArray(byte[] bytes) {
final ByteBuffer ret = ByteBuffer.wrap(new byte[bytes.length]);
ret.put(bytes);
ret.flip();
return ret;
}
- rewind
rewind倒回,将position 设置为0,重新读取
public final Buffer rewind() {
position = 0;
mark = -1;
return this;
}
- clear
clear 并没有真正的清除数据,将position设置为0,limit设置为capacity.
public final Buffer clear() {
position = 0;
limit = capacity;
mark = -1;
return this;
}
ByteBuffer
ByteBuffer 相比较其他的缓冲器有些区别
可以分配直接缓冲区
直接缓冲区,JVM会尽可能的直接在此缓冲区执行本机IO操作。避免与中间缓冲区交互可以通过mapping将文件区域直接映射到内存来创建、
访问二进制数据
参考
http://www.javaworld.com/article/2078654/java-se/java-se-five-ways-to-maximize-java-nio-and-nio-2.html
http://javapapers.com/java/java-nio-buffer/
https://docs.oracle.com/javase/7/docs/api/java/nio/package-summary.html#buffers
JDK 源码学习——ByteBuffer的更多相关文章
- JDK源码学习--String篇(二) 关于String采用final修饰的思考
JDK源码学习String篇中,有一处错误,String类用final[不能被改变的]修饰,而我却写成静态的,感谢CTO-淼淼的指正. 风一样的码农提出的String为何采用final的设计,阅读JD ...
- JDK源码学习系列05----LinkedList
JDK源码学习系列05----LinkedList 1.LinkedList简介 LinkedList是基于双向链表实 ...
- JDK源码学习系列04----ArrayList
JDK源码学习系列04----ArrayList 1. ...
- JDK源码学习系列03----StringBuffer+StringBuilder
JDK源码学习系列03----StringBuffer+StringBuilder 由于前面学习了StringBuffer和StringBuilder的父类A ...
- JDK源码学习系列02----AbstractStringBuilder
JDK源码学习系列02----AbstractStringBuilder 因为看StringBuffer 和 StringBuilder 的源码时发现两者都继承了AbstractStringBuil ...
- JDK源码学习系列01----String
JDK源码学习系列01----String 写在最前面: 这是我JDK源码学习系列的第一篇博文,我知道 ...
- JDK源码学习笔记——LinkedHashMap
HashMap有一个问题,就是迭代HashMap的顺序并不是HashMap放置的顺序,也就是无序. LinkedHashMap保证了元素迭代的顺序.该迭代顺序可以是插入顺序或者是访问顺序.通过维护一个 ...
- JDK源码阅读-ByteBuffer
本文转载自JDK源码阅读-ByteBuffer 导语 Buffer是Java NIO中对于缓冲区的封装.在Java BIO中,所有的读写API,都是直接使用byte数组作为缓冲区的,简单直接.但是在J ...
- JDK源码学习笔记——String
1.学习jdk源码,从以下几个方面入手: 类定义(继承,实现接口等) 全局变量 方法 内部类 2.hashCode private int hash; public int hashCode() { ...
随机推荐
- 从零开始系列之vue全家桶(2)安装调试插件vue Devtools
小白安装前提是会用git,会从github上找东西. 第一步: 我们可以先从github上找到vue-devtools的项目,下载到本地.下载vue-devtools链接. 克隆方法:git clon ...
- HTML5中meta属性大集合
1.声明文档的字符编码 <meta charset='utf-8'> 2.声明文档的兼容模式 <meta http-equiv="X-UA-Compatible" ...
- [LeetCode] Next Greater Element III 下一个较大的元素之三
Given a positive 32-bit integer n, you need to find the smallest 32-bit integer which has exactly th ...
- HDU - 3037:Saving Beans
#include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #in ...
- ●BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3926题解&&代码: 后缀自动机,Trie树 如果以每个叶子为根,所有的子串一 ...
- 洛谷P2572 [SCOI2010]序列操作
线段树 pushdown写的很浪~ #include<cstdio> #include<cstdlib> #include<algorithm> #include& ...
- [51nod1238]最小公倍数之和V3
来自FallDream的博客,未经允许,请勿转载,谢谢. ----------------------------------------------------------------------- ...
- 音频自动增益 与 静音检测 算法 附完整C代码
前面分享过一个算法<音频增益响度分析 ReplayGain 附完整C代码示例> 主要用于评估一定长度音频的音量强度, 而分析之后,很多类似的需求,肯定是做音频增益,提高音量诸如此类做法. ...
- 使用python+requests+unittest实现接口自动化测试
这两天一直在找直接用python做接口自动化的方法,在网上也搜了一些博客参考,今天自己动手试了一下. 一.整体结构 上图是项目的目录结构,下面主要介绍下每个目录的作用. Common:公共方法:主要放 ...
- cisco 的六种模式(cisco 系统)