Java NIO深入(Buffer)-我们到底能走多远系列(18)
我们到底能走多远系列(18)
扯淡:最近想要跳槽,现公司的主管不高兴,没提的时候关系好像很好,提的时候我比较坚决,他硬要我留一个月,老实说我想弄个三周就好了,对,国际惯例一个月,我也是想砍个一周下来休息下,他居然恐吓我,表达出我不仁他就不义的态度,表示可以再没走的时候为难我。现在开始挑我工作毛病了,态度已经不行了,有点装不住了,哈哈。我想,你这么搞我,我交接也不会尽全力了的,做到本职就滚蛋,留下的坑,你们慢慢填。
最近一个月,经历了些事情,又教育了我一边,要投资自己,让自己变强,才能在有风雨时不倒。侥幸想在别人的树下躲避风雨的,今天可能过了关,包不好明天能不能过。我觉得,不要受制于人的要求是有点高,能做到不完全受制于人已经不错了。
主题:
关于NIO的基本知识在(系列17)记录过了,继续来了解下Buffer
Buffer API:
int capacity()//返回此缓冲区的容量。 Buffer clear()//清除此缓冲区。 Buffer flip()//反转此缓冲区。 boolean hasRemaining()//判断在当前位置和限制之间是否有任何元素。 abstract boolean isReadOnly()//判断此缓冲区是否为只读缓冲区。 int limit()//返回此缓冲区的限制。 Buffer limit(int newLimit)//设置此缓冲区的限制。 Buffer mark()//在此缓冲区的位置设置其标记。 int position()//返回此缓冲区的位置。 Buffer position(int newPosition)//设置此缓冲区的位置。 int remaining()//返回当前位置与限制之间的元素数量。 Buffer reset()//将此缓冲区的位置重新设置成以前标记的位置。 Buffer rewind()//重绕此缓冲区。
直接看源码,关于其中的flip和clear方法在系列17中详细学习了。
public abstract class Buffer {// Invariants: mark <= position <= limit <= capacityprivate int mark = -1; // 一个备忘位置private int position = 0; // 位置,下一个要被读或写的元素的索引,根据它来决定读哪个位置private int limit; // 上界,缓冲区的第一个不能被读或写的元素。private int capacity; // 缓冲区容量。缓冲区创建时被设定,并且永远不能被改变。// 初始化Buffer(int mark, int pos, int lim, int cap) { // package-privateif (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 Buffer position(int newPosition) {if ((newPosition > limit) || (newPosition < 0))throw new IllegalArgumentException();position = newPosition;if (mark > position) mark = -1; // 因为重新设置position,mark可能超过它,索性把mark还原// 返回设置好后新的自己// 这种返回自己的方式可以实现支持级联调用,比如buffer.mark().position(5).reset( );return this; }public final int limit() {return limit;}public final Buffer limit(int newLimit) {if ((newLimit > capacity) || (newLimit < 0))throw new IllegalArgumentException();limit = newLimit;// limit的设置牵涉到下面两个:position和markif (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;// 把position设置到mark的位置,下一次读数据的时候就可以,从mark的位置读起了。return this;}public final Buffer clear() {position = 0; // position清零limit = capacity; // limit初始化mark = -1; // mark初始化// 三步操作这个Buffer又重生了。可以继续用了。下一次写入,就是覆盖即可。// 注意clear方法返回了自己,因为clear方法没有真正意义上clear自己的内容,如果这时候我们操作返回的buffer,这个buffer是有内容的。return this; }public final Buffer flip() {limit = position;position = 0;mark = -1;return this;}public final Buffer rewind() {position = 0;// 和clear()操作不同的是少了limit初始化,如此即可实现对这个buffer的重读mark = -1;return this;}//返回当前位置与限制之间的元素数量。public final int remaining() {return limit - position;}//判断在当前位置和限制之间是否有任何元素。 public final boolean hasRemaining() {return position < limit;}// 所有的缓冲区都是可读的,但并非所有都可写。public abstract boolean isReadOnly();// 后面还有nextGetIndex(),nextGetIndex(int nb) 等方法,因为是不是对外提供的方法,就不进一步介绍了。 }
ByteBuffer的API:
1,HeapByteBuffer中实现了抽象类ByteBuffer中为实现的方法。
2,ByteBuffer中的get set 方法就是对一个数组的操作。
get的四个方法:
get();
get (int index);
get(byte[] dst);
get(byte[] dst, int offset, int length);
前两个方法比较好理解,返回的是取得的内容,后面两个方法是将此缓冲区的字节传输到给定的目标数组中。
来看下源码:
public ByteBuffer get(byte[] dst) {return get(dst, 0, dst.length); }public ByteBuffer get(byte[] dst, int offset, int length) {checkBounds(offset, length, dst.length);if (length > remaining())throw new BufferUnderflowException();int end = offset + length;// 最后还是一个个拿for (int i = offset; i < end; i++)dst[i] = get();return this; }
put方法API:
abstract ByteBuffer put(byte b)
ByteBuffer put(byte[] src)
ByteBuffer put(byte[] src, int offset, int length)
ByteBuffer put(ByteBuffer src)
abstract ByteBuffer put(int index, byte b)
压缩方法:
public abstract ByteBuffer compact( );
看下图,使用前:
使用后:
调用compact()的作用是丢弃已经释放的数据,保留未释放的数据,并使缓冲区对重新填充容量准备就绪。但是需要注意的时候如果我们需要马上读取数据的时候还是需要先调用flip()方法,把position置0。
有点发烧,预计的内容写不上去,先停一下,下次补上去。
让我们继续前行
----------------------------------------------------------------------
努力不一定成功,但不努力肯定不会成功。
共勉。
Java NIO深入(Buffer)-我们到底能走多远系列(18)相关推荐
- Java 阶段面试 知识点合集 - 我们到底能走多远系列(15)
我们到底能走多远系列(15) 扯淡:这些知识点来源是通过面试涉及到的,面的公司不多,知识点涉及也不多,我每次面试后都在备忘录里写下有用的东西,集合起来分享一下,因为是知识点,所以就不出什么面试题目啦. ...
- js中this和回调方法循环-我们到底能走多远系列(35)
我们到底能走多远系列(35) 扯淡: 13年最后一个月了,你们在13年初的计划实现了吗?还来得及吗? 请加油~ 主题: 最近一直在写js,遇到了几个问题,可能初入门的时候都会遇到吧,总结下. 例子: ...
- html5实现饼图和线图-我们到底能走多远系列(34)
我们到底能走多远系列(34) 扯淡: 送给各位一段话: 人生是一个不断做加法的过程 从赤条条无牵无挂的来 到学会荣辱羞耻 礼仪规范 再到赚取世间的名声 财富 地位 但是人生还要学会做减法 财富 ...
- 图片尺寸判断等-我们到底能走多远系列(21)
我们到底能走多远系列(21) 扯淡:又是一年过年,给各位拜个很早很早的年,实在点的祝福:祝各位明年工资全部翻一番啦! 主题: 1,判断上传图片尺寸功能 如下代码即可在页面上结果掉这个问题: var i ...
- 程序员在写作这条路上到底能走多远?
01 杨过这辈子什么时候最痛苦?被郭襄她姐砍掉了一只胳膊的时候,那时他身中情花之毒,活不了多久了,他最爱的姑姑又不辞而别:在这个时候,他想到的就是一个人偷偷地离开,做好了告别这个世界的准备. 我在什么 ...
- Java NIO:Buffer、Channel 和 Selector
Buffer 一个 Buffer 本质上是内存中的一块,我们可以将数据写入这块内存,之后从这块内存获取数据. java.nio 定义了以下几个 Buffer 的实现,这个图读者应该也在不少地方见过了吧 ...
- java堆缓冲区,Java NIO之Buffer(缓冲区)
Java NIO主要解决了Java IO的效率问题,解决此问题的思路之一是利用硬件和操作系统直接支持的缓冲区.虚拟内存.磁盘控制器直接读写等优化IO的手段:思路之二是提供新的编程架构使得单个线程可以控 ...
- Java NIO SocketChannel+Buffer+Selector 详解(含多人聊天室实例)
一.Java NIO 的核心组件 Java NIO的核心组件包括:Channel(通道),Buffer(缓冲区),Selector(选择器),其中Channel和Buffer比较好理解 简单来说 N ...
- JAVA NIO缓冲区(Buffer)------ByteBuffer常用方法详解
缓冲区(Buffer) 缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对输入/输出(I/O)的数据作临时存储,这部分预留的内存空间就叫做缓冲区: 使用缓冲区有这么两个好处: 1.减少实际 ...
- 网红经济到底能走多远?
网红经济是以一位年轻貌美的时尚达人为形象代表,以红人的品味和眼光为主导,进行选款和视觉推广,在社交媒体上聚集人气,依托庞大的粉丝群体进行定向营销,从而将粉丝转化为购买力的一个过程.n由于变现能力强大, ...
最新文章
- mongodb java findone_java-MongoRepository findOne使用“ id”代替“ _id”
- 白宫力挺FBI:库克干扰司法与正义
- 云计算的三种服务模式:IaaS,PaaS,SaaS
- SAP CRM configuration product在UI上的显示逻辑
- HTML pattern
- Python刷题之路,怎样做才能让技术突飞猛进
- 天气预报\气象服务APP素材框架模板|UI及UX设计好帮手
- 谷歌开源代码评审规范:好坏代码应该这样来判断
- php单击显示对应内容,关于php:如何单击此“提交”按钮,并使其显示原始查询中的数据,而不是清除它并进入空白页?...
- ESP32-IDF给FATFS添加长文件名支持,更改_USE_LFN以支持大于8.3格式的文件名
- vc2005 seh新认识
- 老板说,我请你来,不是叫你无脑拷贝的,竟然在线上搞出这么大的一个BUG......
- 反插值法求函数方程的根(内附代码及例题)
- Phalcon调试大杀器之phalcon-debugbar安装
- 单词数 HDU - 2072
- 【高德地图入门】--- 绘制面
- R语言编写自定义函数计算分类模型评估指标:准确度、特异度、敏感度、PPV、NPV、数据数据为模型预测后的混淆矩阵、比较多个分类模型分类性能(逻辑回归、决策树、随机森林、支持向量机)
- Spring 5.X+CXF 3.X 开发SOAP Web Service服务端实例
- 工具技巧和读文档 | 读函数式编程接口文档 | 匿名内部类 | lambda表达式 |IDEA
- Zip4j 压缩包加密压缩与解压
热门文章
- phpeclipse中操作svn
- Yii Framework2.0开发教程(10)配合mysql数据库实现用户登录
- OFFICE技术讲座:段落五种对齐方式的说明
- 管理新语:别人反映问题,你要形成自己的材料
- 全网首发:怎样制作CDKEY(3)-加密
- 软件基本功:垃圾代码是怎样产生的?
- error LNK2001: 无法解析的外部符号_wWinMainCRTStartup
- Eclipse无法DEBUG
- RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is Fal
- 全网首发:安装Python(或其他软件)出现0x80072f7d错误的解决办法