java bytebuffer 清空_Java ByteBuffer用法总结
最近用SocketChannel进行网络编程比较多,中间也遇到了几个问题,出现的bug也主要来自于对于ByteBuffer的使用不当。现在终于调通了,对ByteBuffer及Socket网络编程也有了更深的认识,特此总结一下。
对于ByteBuffer主要需要注意的是几个标志的含义:position,limit,capability,mark.几个操作的影 响:flip(),clear(),rewind().还有就是在读取或者写入时,标志的变化,比如get()方法导致position加1.
SocketChannel采用的是非阻塞异步读取流数据,在读取的时候,通常是
ByteBuffer.clear();
SocketChannel.read(ByteBuffer);
如果流中有数据,就会把数据从position开始读到ByteBuffer中,在读取之前ByteBuffer的clear操作会把 position置为0,limit置为capability,也就是相当于清空了之前的内容,但是ByteBuffer中数组的内容在read之前是没 有改变的.
read之后,通常就是开始从ByteBuffer中提取读到的数据,如果你的数据是以自己定义的数据包的格式进行发送的,那你还需要判断是否读到 了数据包的结尾,因为对流数据本身来说是没有结尾这一说的。在提取数据之前,要先把position放到开始读取时的位置,把limit放到当前位置,所 以要flip一下,表示从position到limit的位置都是需要的数据。
ByteBuffer.flip();
while(ByteBuffer.hasRemaining()){
bytec=ByteBuffer.get();
if(b==PACKAGE_END){
//you can return the package here
}else{
//you can append the byte here.like StringBuilder.append().
}
}
这样以来也存在一个问题,当一次读到的ByteBuffer不包含完整的数据包或者包含多个数据包.那么就需要在下一次继续把这些包分拆出来.那么在读取数据的代码处就可以改为,这样就把之前读取到的未完整的包保留了下来:
if(!ByteBuffer.hasRemaining){
ByteBuffer.clear();
SocketChannel.read(ByteBuffer);
}
另外一个可能会用到的操作就是ByteBuffer.rewind(),他会把position置为0,limit保持不变,可以用于重复读取一段数据.
ByteBuffer是nio中一个非常方便的工具.设计思想也非常值得借鉴.
java bytebuffer 清空_Java ByteBuffer用法总结相关推荐
- java buffer类_Java ByteBuffer类
我正在从设备读取byte [],并尝试通过ByteBuffer类将其解释为Java中的整数数组,但是我得到了索引超出范围的错误.看这里: byteBuffer.put(bytes); // put t ...
- java super实例_java Super 用法详解及实例代码
java Super 用法详解及实例代码 发布于 2021-1-8| 复制链接 摘记: java Super 用法详解 1)有人写了个很好的初始化属性的构造函数,而你仅仅想要在其中添加另一些自己新建 ...
- java 注解使用_Java 注解用法
Java 注解用法 1.简述 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata) 与程序元素(类.方 ...
- java assert函数_Java Assert 用法简介
在JDK1.4中增加了Assert的新功能,用于开始.调试时期的错误检测,它可以通过-ea 的JVM参数关闭,关闭以后对程序的性能没有任何影响. 最好的教程 请见:http://java.sun.co ...
- java switch 变量_Java switch 用法实例
首页 > 基础教程 > 循环条件语句 > 条件语句switch Java switch 用法实例 switch允比对一个变量的值,来执行不同情况的代码.switch使用规则如下: 1 ...
- java enum使用_java enum用法详解
我们都知道,enum是java的一个语法糖,实际编译后的文件仍然是一个java类,今天我们就拨开语法糖的外衣,看一看原始的java类应该是什么样的. 首先写一个enum类: enum Color { ...
- java contains方法_Java contains用法示例
学习Demo contains方法:用于判断list集合是否包含某个元素 containsKey方法:用于判断Map键中是否包含某个键 containsValue方法:用于判断map中是否包含某个va ...
- java jpanel清空_java怎么清除JPanel里面所有组件并重绘
我拿我自己正在做的一个界面来介绍一下 这是是解决了清除JPanel组件并能重绘的代码 import java.awt.*; import java.awt.event.ActionEvent; imp ...
- java stringbuilder清空_Java中StringBuilder的清空方法比较
StringBuilder 没有提供clear或empty方法. 清空有3种方法: 1)新生成一个,旧的由系统自动回收 2)使用delete 3)使用setLength 将三种方法循环1000万次,代 ...
最新文章
- 生成24位字符串ID__IdGenerator.java
- Google 团队效能研究 | 为什么雇用最聪明的人是远远不够的?
- c语言 内存搜索,怎么在一段内存中搜索一个十六进制串
- 通过SEH 非inline hook
- 10个最好的 jQuery 视频插件(转)
- iOS 12.0-12.1.2 完整越狱支持 Cydia
- 康托展开逆展开算法笔记
- 2011-5-学习总结
- 爬虫教程( 1 ) --- 初级、基础、实践
- Oracle 中文排序 Oracle 中文字段排序
- iPad横竖屏代码适配
- USACO CONTEST FEB07 白银莲花池 silvlily 分析
- CVPR 2020 《Graph-Structured Referring Expression Reasoning in The Wild》论文笔记
- c8t6高电平电压_什么是高电平和低电平?
- LDAP未授权漏洞验证
- r语言进行go富集分析_好用的在线GO富集分析工具
- charindex 和patindex详解(转)
- 运筹学基础(名词解释题总结)
- qq飞车与服务器未响应,QQ飞车游戏安装失败系统错误提示问题解决方法_QQ飞车游戏安装失败怎么办_游戏堡...
- 主导资源公平DRF:多种资源类型的公平分配
热门文章
- 他在BAT等大厂研发10年,总结了12条开发经验给你
- JSP+Servlet使用commons-fileupload上传文件连接被重置解决方案
- 计算机服务器机房属于什么辐射,服务器机房中的辐射有多大?如何减少服务器机房中的辐射...
- ppt如何导出成高清图片
- Python语法入门之流程控制if判断
- 用easyPoi导出excel,带多sheet,合并单元格,合计,单元格金额类型
- 贵阳经开区管委会考察团到访数澜科技,共探城市数据运营解决方案
- 华为开发者大会2021鸿蒙系统,鸿蒙2.0来了!华为开发者大会HDC 2020宣布
- Scrapy爬取图片网站——最详细的入门爬虫教程,新手入门干货,不进来看一下?
- 中文文件如何翻译为英文