关于ByteBuffer使用解释

转载自  关于ByteBuffer使用解释

之前看过相关的ByteBuffer的使用,但是问题是那时还年轻,所以现在有点老了,因此,忘记了,所以决心看源代码了解一番----故作此篇文章。

 

查看ByteBuffer的API,看的我是一头雾水,搞不清什么mark、position、limit、flip、reset几个的用法,先看下面的例子:

         String str = "helloWorld";  ByteBuffer buff  = ByteBuffer.wrap(str.getBytes());  System.out.println("position:"+buff.position()+"\t limit:"+buff.limit());  //读取两个字节  buff.get();  buff.get();  System.out.println("position:"+ buff.get(buff.position())+"\t limit:"+buff.limit());  buff.mark();  System.out.println("position:"+buff.position()+"\t limit:"+buff.limit());  buff.flip();  System.out.println("position:"+buff.position()+"\t limit:"+buff.limit());
输出结果: 

position:0  limit:10  

position:2  limit:10  

position:2  limit:10  

position:0  limit:2  

我们以每位开发人员熟悉的”helloworld“,用ByteBuffer将字符串包装,由于ByteBuffer是一个抽象类,通过wrap包装的对象将实际返回的是一个HeapByteBuffer对象。由此可知HeapByteBuffer是ByteBuffer的子类,同样的ByteBuffer又是Buffer抽象类的子类。以上提到的mark、position、limit、flip、reset都是出自于Buffer这个抽象类。
下面我们来解析几个方法的,当我们调用了wrap方法后Buffer中初始化的结构是:
注释:
m:mark;
p:position;
L:limit;
初始情况下mark是指向第一个元素之前的的即-1,postion为指向第一个元素为0.而Limit是被赋值为byte[]的长度。
因此这就是打印结果的第一行。
m  p       L
-10123456789 
 HELLOWORLD 
当我们连续调用两次get()方法获得两个个字节,每次调用都会触发position++操作,那么此时position就会移动到index = 2的的地方,而这个时候Limit和mark是不会发生变化的。如果将读取的两个字节打印会是H和E,因此执行结果第二行会有position:2  limit:10结果.
   m、p       L
-10123456789 
 HELLOWORLD 
读取完毕后我们使用mark,这个时候mark会从-1移动到2和position指向同一个元素,可以看见Limit是不会发生改变的。
mp L        
-10123456789 
 HELLOWORLD 
使用了mark标记的当前的position后,如果们调用flip,这个时候Limit就会指向position的位置,并将mark和position还原为初始值。这样就知道了limit当前的就为2,什么意思呢?就是说当前可以读的字节数是2。
我们可以尝试一下如下代码:
System.out.println((char)buff.get()+""+(char)buff.get()); 
输出结果:he
貌似这也没什么稀奇的,如果你在代码换成
// System.out.println((char)buff.get()+""+(char)buff.get()  System.out.println((char)buff.get()+""+(char)buff.get()+""+(char)buff.get());  
输出结果:
limit:10  
Exception in thread "main" java.nio.BufferUnderflowException  
    at java.nio.Buffer.nextGetIndex(Buffer.java:474)  
    at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:117)  
    at com.taobao.moxing.notify.Main.main(Main.java:33)position:2    limit:10  
position:2   limit:10  
position:0   limit:2  
   为什么会抛异常呢?原因是limit的含义就想一个窗口,你当前能读到的数据就是当前窗口限制的(本例中即为2),如果这个窗口之外的所有元素都是不可读的。至此我想你和我就应该明白这几个参数的含义了吧。
而至于reset方法,它是将当前的position设置为0,
rewind是将mark重置为-1,position重置为0;
clear方法是真正的重置,将mark=-1,position=0,limit=capacity(即当前buffer的容量)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329006.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 命令 抛后台,在后台运行Linux命令的方法

通常情况下,当你在终端运行一个命令,在你开始输入另外一个命令之前,你必须等待当前命令运行结束。这被称为在前台运行命令,或者前台进程。当一个进程在前台运行时,它占用了你的 shell,并且你可以通过输入设…

.Net 分布式云平台基础服务建设说明概要

1) 背景 建设云平台的基础框架,用于支持各类云服务的业务的构建及发展。 2) 基础服务 根据目前对业务的理解和发展方向,总结抽象出以下几个基础服务,如图所示 3) 概要说明 基础服务的发展会根据业务的发…

当当网头部和尾部——CSS源码

头部 charset "utf-8"; /* CSS Document *//*网页头部导航样式开始*/ .header_top,.header_middle,.header_search{margin-left:auto;margin-right:auto;width:955px;clear:both; } .header_top{border:solid 1px #999;background-image:url(../images/dd_header_bg.…

全球首发免费的MySql for Entity Framework Core

Background 一时兴起,想实现.NET Core下的MySQL ADO层和与Entity Framework Core对接,同时也是非常鄙视某厂商借着目前Oracle官方没有对.NET Core进行支持的时机捞金,然后也是为了学习一下Microsoft的Entity Framework原理,于是这…

麒麟linux百度云,百度网盘 Linux 版发布,搭配优麒麟运行更完美!

百度网盘 Linux 版发布,搭配优麒麟运行更完美!Linuxer 2019年6月21日 暂无评论 阅读 3,363 次近日,百度官宣推出了百度网盘 Linux 版(在此之前已发布 Windows、Android、iPhone、iPad、Windows Phone、Mac 等多个平台的版本),版本号为 Linux …

学习笔记之ByteBuffer使用和实现以及文件内存映射

转载自 学习笔记之ByteBuffer使用和实现以及文件内存映射ByteBuffer和CharBuffer等其它Buffer的直接子类一样,顾名思义,就是存取字节的Buffer。很多数据最终在和底层交互上都是使用了字节,而更大的数据是由字节组合而成。谈到字节的组合&…

当当网上书店头部和尾部——JS源码

头部 $(function($){ // οnmοuseοver"myddang_show(dd_menu_top_down)" οnmοuseοut"myddang_hidden(dd_menu_top_down)"//下拉菜单$("#menu").mouseenter(function(){$("#dd_menu_top_down").slideDown(1000);}).mouseleave(…

SQL注入(SQL Injection)

简介 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。 根据…

c语言程序设计班档案管理系统报告,C语言班级档案管理系统

《C语言班级档案管理系统》由会员分享,可在线阅读,更多相关《C语言班级档案管理系统(28页珍藏版)》请在人人文库网上搜索。1、c语言程序设计”课程设计报告班级档案管理学生姓名: 王标 刘慧慧 魏枫林 奚亚运 指导教师: 夏 芸 所 在…

深入理解ByteBuffer

转载自 深入理解ByteBufferByteBuffer类是在Java NIO中常常使用的一个缓冲区类,使用它可以进行高效的IO操作,但是,如果对常用方法的理解有错误,那么就会出现意想不到的bug。ByteBuffer类的常用方法 先来看看一个基本的程序public…

c语言倒置存放,c语言倒置

为什么使用人脸识别返回数据为空? 问题现象 上传照片中的人像可能存在横置或倒置等情况。 解决方法 尽量选择纯色无干扰背景,保证图片中人像清晰。 上传的人脸图片要求:侧脸不超过30,抬头低头不超过15。 图片中人脸需要保持竖置正…

当当网新用户注册界面——界面源码

<strong><span style"font-size:32px;color:#ff9966;">所有用到的图片都已上传&#xff0c;请在<a target_blank href"http://download.csdn.net/detail/qq_34137397/9667142">这里</a>下载</span></strong><!DOCT…

dotnetCore增加MiddleWare的Run,Use Map MapThen四个扩展方法

什么是中间件 中间件是在管道中处理Request请求与Responses响应的一种组件&#xff0c;每种组件可以选择是否让Request进入到下一个组件去处理。 译得不好&#xff0c;大家可以自己看原文Middleware 更详细的还可以参照园中大神的作品&#xff1b; 有汤姆大叔的解读ASP.NET 5 &…

Java GC系列(1):Java垃圾回收简介

转载自 Java GC系列&#xff08;1&#xff09;&#xff1a;Java垃圾回收简介这篇教程是系列第一部分。首先会解释基本的术语&#xff0c;比如JDK、JVM、JRE和HotSpotVM。接着会介绍JVM结构和Java 堆内存结构。理解这些基础对于理解后面的垃圾回收知识很重要。 Java关键术语 Ja…

下载的c语言程序代码怎么运行,CFree怎么运行程序 编译运行C语言程序代码的方法...

CFree是一款C语言编译软件&#xff0c;用户可以利用这款软件编译C/C程序 &#xff0c;如果你想要运行已经编写好的C语言代码&#xff0c;只需要几个简单的操作即可实现&#xff0c;如果你还不知道怎么运行&#xff0c;就赶快来看看下面的教程吧&#xff01;1、首先需要先进入到…

docker4dotnet #2 容器化主机

.NET 猿自从认识了小鲸鱼&#xff0c;感觉功力大增。上篇 《docker4dotnet #1 前世今生 & 世界你好》中给大家介绍了如何在Windows上面配置Docker for Windows和Docker Tools for Visual Studio来使用docker协助.NET Core应用的开发&#xff0c;这篇我们来看看如何创建和管…

Java GC系列(2):Java垃圾回收是如何工作的

转载自 Java GC系列&#xff08;2&#xff09;&#xff1a;Java垃圾回收是如何工作的本教程是为了理解基本的Java垃圾回收以及它是如何工作的。这是垃圾回收教程系列的第二部分。希望你已经读过了第一部分&#xff1a;《Java 垃圾回收介绍》。 Java 垃圾回收是一项自动化的过…

c语言程序为什么运行一半就自动关闭了,C语言为什么程序运行一半就出现停止工作...

匿名用户1级2016-04-04 回答有点儿意思。原因却出乎意料的简单。 char *rwtab[27]{"main","if","then","while","do"," static","int"," double","struct","break",&quo…

docker4dotnet #1 – 前世今生 amp; 世界你好

作为一名.NET Developer&#xff0c;这几年看着docker的流行实在是有些眼馋。可惜的是&#xff0c;Docker是基于Linux环境的&#xff0c;眼瞧着那些 java, python, node.js, go 甚至连php程序员都可以docker了&#xff0c;自己还在苦哈哈的装虚拟机&#xff0c;实在是急啊&…

Java GC系列(3):垃圾回收器种类

转载自 Java GC系列&#xff08;3&#xff09;&#xff1a;垃圾回收器种类在这篇教程中我们将学习几种现有的垃圾回收器。在Java中&#xff0c;垃圾回收是一个自动的进程可以替代程序员进行内存的分配与回收这些复杂的工作。这篇是垃圾回 收教程系列的第三篇&#xff0c;在前面…