当前位置: 首页 > 编程日记 > 正文

Java NIO中的Buffer

简介

Buffer缓冲区,首先要弄明白的是,缓冲区是怎样一个概念。它其实是缓存的一种,我们常说的缓存,包括保存在硬盘上的浏览器缓存,保存在内存中的缓存(比如Redis、memcached)。Buffer是把数据保存在内存中,它本质上用来保存数据的数据结构是数组,例如ByteBuffer是byte数组,IntBuffer是int数组等,对Buffer读写操作,其实是对该数组进行数据存放、读取、清除操作。

Buffer可以理解成是一个容器,可以往容器里写入数据,也可以从容器中读取数据,可以一个字节一个字节的读写,也可以多个字节读写,可以在写的途中切换为读,读到一半又切换到写,等等。。。

Buffer有以下几个属性:

  • int mark 标记
  • int position 位置
  • int limit限制
  • int capacity缓冲区的容量,Buffer的容量是固定的,在创建Buffer对象时,制定容量大小。

这几个属性,有什么作用,用在什么地方,为何设置这4个属性。其实不用先理解,在了解reset(),flip()等方法后,就会明白这四个属性的用处。

主要方法

mark、reset

  • mark() 在Buffer当前的位置设置标记
public final Buffer mark() {mark = position;return this;
}
  • reset() 重置Buffer当前的位置为上一次的标记
public final Buffer reset() {int m = mark;if (m < 0)throw new InvalidMarkException();position = m;return this;
}

这两个方法的使用场景,从Buffer读取n个字节数据,结果读出来的数据长度比n小(比如网络是拆包问题),这时候会重新再读一次,调用reset()方法。但并不是所有读操作是从位置0开始读,所以在reset()先设置一个标记,调用mark(),最后position = mark,就是从标记的mark位置开始读。

clear,flip, rewind

  • clear() 清除Buffer
public final Buffer clear() {position = 0;limit = capacity;mark = -1;return this;
}
  • flip() 反转Buffer,何谓“反转”?在执行完写操作之后,调用调用flip()为下次的读操作准备。
public final Buffer flip() {limit = position;position = 0;mark = -1;return this;
}

使用场景:在进行完写操作后,写入100个字节,所以当前位置position=100,为了下次读操作,读出来是这100个字节数据,所以limit也设为100,限制最多读到100个字节。下次读是从位置0开始,所以position=0。

ByteBuffer buffer = ByteBuffer.allocate(100);
String value = "zhangxh20";
buffer.put(value.getBytes());
buffer.flip();
byte [] arr = new byte[buffer.remaining()];
buffer.get(arr);
String decodeValue = new String(arr);

看下调用flip()操作前后的对比。

如果不做flip操作,读到的将是position到capacity之间的错误内容。

当执行flip()操作之后,它的limit被设置为position,position设置为0,capacity不变,由于读取的内容是从position到limit之间,因此,他能够正确读取到之前写入缓冲区的内容。

  • rewind() 重绕Buffer,可以发现rewind()比flip()少了个步骤limit = positon。
public final Buffer rewind() {position = 0;mark = -1;return this;
}

使用场景:buffer.get(array),把buffer的数据复制到array数组里,会调用buffer的get()方法。get()是从position开始复制,最多limit个,所以只需positon设置为0。

其他特性

不变式

标记、位置、限制和容量值遵守以下不变式:

0 <= 标记 <= 位置 <= 限制 <= 容量
  新创建的缓冲区总有一个 0 位置和一个未定义的标记。初始限制可以为 0,也可以为其他值,这取决于缓冲区类型及其构建方式。一般情况下,缓冲区的初始内容是未定义的。

线程安全

Buffer不是线程安全的,被多个线程使用时,需要加同步。

ByteBuffer

byteBuffer字节缓冲区,即每次调用get()或者put()操作的数据最小单位是byte,理IntBuffer、LongBuffer、DoubleBuffer以此类推。例如LongBuffer put()最小的单位是8个字节的long数据。日常开发中,ByteBuffer使用的会比较多,其他类型Buffer很少使用。
  事实上ByteBuffer也可以用来表示其他类型Buffer,比如IntBuffer的get(),可以用ByteBuffer的getInt(),两个实现效果一样。

堆内存和直接内存

Buffer在创建时,必须指定容量大小,还有分配内存的类型,有两种堆内存和直接内存,直接可以理解为堆外的内存空间,区别就是,直接内存是不受GC管理

参考资料

  • 《Netty权威指南》

转载于:https://www.cnblogs.com/zhangxh20/p/7163863.html

相关文章:

编写高质量代码改善C#程序的157个建议——建议86:Parallel中的异常处理

建议86&#xff1a;Parallel中的异常处理建议85阐述了如何处理Task中的异常。由于Task的Start方法是异步启动的&#xff0c;所以我们需要额外的技术来完成异常处理。Parallel相对来说就要简单很多&#xff0c;因为Parallel的调用者线程会等到所有的任务全部完成后&#xff0c;再…

VS Code – No source control providers 解决方法

QQ技术交流群 173683866 526474645 欢迎加入交流讨论&#xff0c;打广告的一律飞机票 1.点击IDE左侧的搜索 2.在搜索中输入 git.enabled 3.点击Open Serrings 4.在Settings中的搜索框输入 git.enabled 5.把它下方的三个选项User Workpace broadband-h5(项目名称) 的Git en…

如何从JavaScript中的给定数字中形成最小的数字

by Prashant Yadav通过Prashant Yadav 如何从JavaScript中的给定数字中形成最小的数字 (How to form the smallest possible number from a given number in JavaScript) In this tutorial, we will implement an algorithm to form the smallest possible number with ES6.在…

微信小程序在web-view页面做分享,并且把分享的参数传递给小程序

QQ技术交流群 173683866 526474645 欢迎加入交流讨论&#xff0c;打广告的一律飞机票 本demo实现的功能&#xff0c;微信小程序给h5传参&#xff0c;h5给小程序传参 实现代码&#xff1a; <!--index.wxml --><web-view src"https://xxx.xxx.cn/test1.html?us…

洛谷—— P1118 [USACO06FEB]数字三角形Backward Digit Su…

https://www.luogu.org/problem/show?pid1118#sub 题目描述 FJ and his cows enjoy playing a mental game. They write down the numbers from 1 to N (1 < N < 10) in a certain order and then sum adjacent numbers to produce a new list with one fewer number. T…

Centos和Redhat的区别和联系

网上看到的&#xff0c;转载给大家 CentOS与RedHat的关系&#xff1a; RedHat在发行的时候&#xff0c;有两种方式&#xff1a;二进制的发行方式以及源代码的发行方式。无论是哪一种发行方式&#xff0c;你都可以免费获得&#xff08;例如从网上下载&#xff09;&#xff0c;并…

矩阵专职_新的篇章开始了-我将以专职技术作家的身份加入RunCloud

矩阵专职If you used to submit (or read) articles on the freeCodeCamp Medium publication, there is a chance that your article may have been edited by me (or by another member of the team of volunteer editors).如果您以前曾经在freeCodeCamp Medium出版物上提交(…

转:【小作品】STM32无线WIFI视频小车制作剖析(下)

转载于&#xff1a;http://blog.csdn.net/u012819339/article/details/50654764 实体作品请参看优酷视频。 若以上链接点击无效请把该链接地址复制到浏览器地址栏 http://v.youku.com/v_show/id_XODYzODczNzQ4.html 说明&#xff1a; 该作品为arvik于2014年下半年在学校实验室做…

JS 缓存 设置临时缓存和长期缓存 sessionStorage localStorage

QQ技术交流群 173683866 526474645 欢迎加入交流讨论&#xff0c;打广告的一律飞机票 使用 Window sessionStorage 和 localStorage 属性 sessionStorage 用于临时保存同一窗口(或标签页)的数据&#xff0c;在关闭窗口或标签页之后将会删除这些数据 localStorage 缓存在浏览…

SQL中distinct的用法

在表中&#xff0c;可能会包含重复值。这并不成问题&#xff0c;不过&#xff0c;有时您也许希望仅仅列出不同&#xff08;distinct&#xff09;的值。关键词 distinct用于返回唯一不同的值。表A&#xff1a;示例1select distinct name from A 执行后结果如下&#xff1a;示例2…

brain.js 时间序列_免费的Brain JS课程学习JavaScript中的神经网络

brain.js 时间序列The last few years, machine learning has gone from a promising technology to something we’re surrounded with on a daily basis. And at the heart of many machine learning systems lies neural networks.在过去的几年中&#xff0c;机器学习已经从…

小白的Unity5之路(一)

Player移动: 1 public float speed 6f;2 Vector3 movement;3 Rigidbody playerRididbody;4 5 void FixedUpdate () {6 float h Input.GetAxisRaw("Horizontal");7 float v Input.GetAxisRaw("Vertical");8 Move(h, v); 9…

Splunk学习与实践

一、 Splunk公司与产品 美国Splunk公司&#xff0c;成立于2004年&#xff0c;2012年纳斯达克上市&#xff0c;第一家大数据上市公司&#xff0c;荣获众多奖项和殊荣。总部位于美国旧金山&#xff0c;伦敦为国际总部&#xff0c;香港设有亚太支持中心&#xff0c;上海设有海外第…

VUE v-if 和 v-for 的使用示例 VUE根据下标改变图片路径

QQ技术交流群 173683866 526474645 欢迎加入交流讨论&#xff0c;打广告的一律飞机票 v-if 和 v-else v-for <div class"" v-for"(item,index) in [1,1,1,1,1,1,1,1,1,1]"><img v-if"helpeds0" class"tou1" :style"{…

聊天软交互原理_来自不同城市的人们如何在freeCodeCamp聊天室中进行交互

聊天软交互原理by Dborah Mesquita由DborahMesquita 来自不同城市的人们如何在freeCodeCamp聊天室中进行交互 (How people from different cities interact in the freeCodeCamp chatrooms) 推理统计入门以及如何使用spaCy从文本中提取信息 (A primer on Inferential statisti…

使用微信的JS-SDK实现自定义分享到微信朋友圈

QQ技术交流群 173683866 526474645 欢迎加入交流讨论&#xff0c;打广告的一律飞机票 实现代码 <!DOCTYPE html> <html><head><meta name"viewport" content"widthdevice-width, initial-scale1.0, user-scalableno, minimum-scale1.0, …

[Unity3D]Unity3D连衣裙实现游戏开发系统

大家好&#xff0c;我是秦培。欢迎关注我的博客&#xff0c;我的博客地址blog.csdn.net/qinyuanpei。 不知从什么时候開始&#xff0c;国产RPG单机游戏開始出现换装&#xff0c;仙剑系列中第一部实现了换装的游戏是仙剑奇侠传四&#xff0c;后来原上海软星团队。眼下的烛龙科技…

python中nlp的库_单词袋简介以及如何在Python for NLP中对其进行编码

python中nlp的库by Praveen Dubey通过Praveen Dubey 单词词汇入门以及如何在Python中为NLP 编写代码的简介 (An introduction to Bag of Words and how to code it in Python for NLP) Bag of Words (BOW) is a method to extract features from text documents. These featur…

机器学习:计算学习理论

计算学习理论介绍 关键词&#xff1a; 鲁棒性 关键词&#xff1a; 【机器学习基础】理解为什么机器可以学习1——PAC学习模型--简书 关键词&#xff1a;存在必要性&#xff1b;从机器学习角度出发 PAC学习理论&#xff1a;机器学习那些事 关键词&#xff1a;不错的大道理 如果相…

HTML超出部分滚动效果 HTML滚动 HTML下拉 附效果图

QQ技术交流群 173683866 526474645 欢迎加入交流讨论&#xff0c;打广告的一律飞机票 H5 效果图 实现代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>Bootstrap 实例 - 滚动监听&#xff08;Scrollspy&#xff09;…

编写高质量代码改善C#程序的157个建议——建议148:不重复代码

建议148&#xff1a;不重复代码 如果发现重复的代码&#xff0c;则意味着我们需要整顿一下&#xff0c;在继续前进。 重复的代码让我们的软件行为不一致。举例来说&#xff0c;如果存在两处相同的加密代码。结果在某一天&#xff0c;我们发现加密代码有个小Bug&#xff0c;然后…

求职者提问的问题面试官不会_如何通过三个简单的问题就不会陷入求职困境

求职者提问的问题面试官不会by DJ Chung由DJ Chung 如何通过三个简单的问题就不会陷入求职困境 (How to get un-stuck in your job search with three simple questions) 您甚至不知道为什么会被卡住&#xff1f; (Do you even know why you’re stuck?) Your job search can…

不能交换到解决jenkins用户的问题

su - jenkins始终有效&#xff0c;今centos无效&#xff0c;因为/etc/password在文档/bin/bash是yum当安装到/bin/false.之后可以改变。ubuntu安装包和yum安装包的行为不一致啊。版权声明&#xff1a;本文博主原创文章&#xff0c;博客&#xff0c;未经同意&#xff0c;不得转载…

HTML引用公共组件

QQ技术交流群 173683866 526474645 欢迎加入交流讨论&#xff0c;打广告的一律飞机票 在test.html引用footer.html 效果图 代码 test.html <!DOCTYPE html> <html><head><meta charset"utf-8"><title>引用demo</title><s…

Hadoop自学笔记(二)HDFS简单介绍

1. HDFS Architecture 一种Master-Slave结构。包括Name Node, Secondary Name Node,Data Node Job Tracker, Task Tracker。JobTrackers: 控制全部的Task Trackers 。这两个Tracker将会在MapReduce课程里面具体介绍。以下具体说明HDFS的结构及其功能。 Name Node:控制全部的Dat…

如何为Linux设置Docker和Windows子系统:爱情故事。 ?

Do you sometimes feel you’re a beautiful princess turned by an evil wizard into a frog? Like you don’t belong? I do. I’m a UNIX guy scared to leave the cozy command line. My terminal is my castle. But there are times when I’m forced to use Microsoft …

再谈Spring Boot中的乱码和编码问题

编码算不上一个大问题&#xff0c;即使你什么都不管&#xff0c;也有很大的可能你不会遇到任何问题&#xff0c;因为大部分框架都有默认的编码配置&#xff0c;有很多是UTF-8&#xff0c;那么遇到中文乱码的机会很低&#xff0c;所以很多人也忽视了。 Spring系列产品大量运用在…

UDP 构建p2p打洞过程的实现原理(持续更新)

UDP 构建p2p打洞过程的实现原理(持续更新) 发表于7个月前(2015-01-19 10:55) 阅读&#xff08;433&#xff09; | 评论&#xff08;0&#xff09; 8人收藏此文章, 我要收藏赞08月22日珠海 OSC 源创会正在报名&#xff0c;送机械键盘和开源无码内裤 摘要 UDP 构建p2p打洞过程…

Vue父组件网络请求回数据后再给子组件传值demo示例

QQ技术交流群 173683866 526474645 欢迎加入交流讨论&#xff0c;打广告的一律飞机票 这里demo使用延迟执行模拟网络请求&#xff1b;父组件给子组件需要使用自定义属性 Prop &#xff0c;下面是示例代码&#xff1a; <!DOCTYPE html> <html> <head> <me…

gulp-sass_如果您是初学者,如何使用命令行设置Gulp-sass

gulp-sassby Simeon Bello通过Simeon Bello I intern at a tech firm presently, and few days ago I got a challenge from my boss about writing an article. So I decided to write something on Gulp-sass. Setting it up can be frustrating sometimes, especially when…