读取ByteBuffer有效的数据
转:https://zhidao.baidu.com/question/427134449349230532.html
说道 ByteBuffer的缓冲区,就需要知道缓冲区的的三个状态
1)capacity 即容量,也就是缓冲区的大小。它的值是在创建缓冲区的时候指定的,设定后无法对其进行修改。
2)limit 读写限制:也就是缓冲区可以利用(进行读写)的范围的最大值,可以调用ByteBuffer对象的limit(int)方法进行设置,
调用ByteBuffer对象的limit()获取缓冲区读写限制的大小;在刚开始创建缓冲区的时候limit的大小等于capacity。
3)position 读写位置:表示当前进行读写操作时的位置,初始化为0,即缓冲区开始读或者写数据的位置。
可以通过调用ByteBuffer对象的positon(int)方法设置它的值,通过position()可以获取它的值 这三个状态的数值满足一下关系:0=<position=<limit=<capacity 在初始化缓冲区的情况下,position=0;limit = capacity 缓冲区是通过put或者putXXX来向缓冲区添加数据,也可以通过put(index,vlaue)方法在指定的position和limit之间指定的地方添加数据;
通过get()或者getXXX()来获取数据,也可以通过get(int index)方法来获取position到limit之间指定的数据。
注意position的位置会随着数据的写入而移或者读取一个字节一个字节的移动(比如添加一个byte类型的数据position会+1,
添加一个int类型的数据position会+4;),直到position=limit为止。如果position==limit时,
再添加数据会报java.nio.BufferOverflowException、再获取数据会报java.lang.IndexOutOfBoundsException。
正因为向缓冲区添加数据的时候写数据的时候position会变化,如果想获取缓冲区的数据直接调用get等相关方法获取数据是肯定不行的,
因为此时数据在缓冲区存在数据的部分是0~~position之间,而读数据开始的位置position在此区间之外。
所以要获取此区间的数据需要重新设置position的位置,ByteBuffer提供了一个flip方法,
该方法主要进行两部操作 limit = position;(将limit设为当前position) position =0;
此时通过get方法就可以获取到0到limit之间的数据了 以下代码修改至 http://www.cnblogs.com/guazi/p/6474757.html
public static void main(String[] args) {
ByteBuffer buff = ByteBuffer.allocate();
String str = "helloWorld";
buff.put(str.getBytes());
System.out.println(new String(buff.array()));
System.out.println("position:" + buff.position() + "\t limit:"
+ buff.limit() + "\t capacity:" + buff.capacity());
// 读取两个字节byte[] abytes = new byte[1];
byte[] abytes = new byte[];
buff.get(abytes);
System.out.println("get one byte to string:" + new String(abytes));
// Reads the byte at this buffer's current position, and then increments
// the position.
buff.get();
System.out.println("获取两个字节(两次get()方法调用)后");
System.out.println("position:" + buff.position() + "\t limit:"
+ buff.limit());
// Sets this buffer's mark at its position. like
// ByteBuffer.this.mark=position
buff.mark();
System.out.println("mark()...");
System.out.println("position:" + buff.position() + "\t limit:"
+ buff.limit());
// 当读取到码流后,进行解码。首先对ByteBuffer进行flip操作,
// 它的作用是将缓冲区当前的limit设置为position,position设置为0
// flip方法将Buffer从写模式切换到读模式。调用flip()方法会将position设回0,并将limit设置成之前position的值。
buff.flip();
System.out.println("flip()...");
System.out.println("position:" + buff.position() + "\t limit:"
+ buff.limit() + "\t capacity:" + buff.capacity());
byte[] tbyte = new byte[buff.limit()];
buff.get(tbyte);
System.out.println("get one byte to string:" + new String(tbyte));
System.out.println("position:" + buff.position() + "\t limit:"
+ buff.limit());
if (buff.hasRemaining()) {
buff.compact();
} else {
buff.clear();
}
}
还有几个关于这个的,感觉写的还可以:
http://blog.csdn.net/shuaiawp/article/details/51915983
http://www.cnblogs.com/xiaoluo501395377/archive/2012/10/30/2747001.html
读取ByteBuffer有效的数据的更多相关文章
- 一个I/O线程可以并发处理N个客户端连接和读写操作 I/O复用模型 基于Buf操作NIO可以读取任意位置的数据 Channel中读取数据到Buffer中或将数据 Buffer 中写入到 Channel 事件驱动消息通知观察者模式
Tomcat那些事儿 https://mp.weixin.qq.com/s?__biz=MzI3MTEwODc5Ng==&mid=2650860016&idx=2&sn=549 ...
- Python中如何读取xls中的数据
要想读取EXCEL中的数据,首先得下载xlrd包,地址:https://pypi.python.org/pypi/xlrd 安装方法:下载解压后,利用windows dos命令进入解压目录eg,c ...
- 编写SqlHelper使用,在将ExecuteReader方法封装进而读取数据库中的数据时会产生Additional information: 阅读器关闭时尝试调用 Read 无效问题,解决方法与解释
在自学杨中科老师的视频教学时,拓展编写SqlHelper使用,在将ExecuteReader方法封装进而读取数据库中的数据时 会产生Additional information: 阅读器关闭时尝试调用 ...
- 读取、写入excel数据
在实际项目中,不可避免的会操作excel表格.一直以来都是读取excel表格,可今天为了写入excel表格,可是煞费苦心,终于完成,记录下来以便后续使用. 1.读取excel表格的数据 读取excel ...
- 读取redis中的数据时出现:MISCONF Redis is configured to save RDB snapshots
读取redis中的数据时出现:MISCONF Redis is configured to save RDB snapshots 以下为异常详细信息: Exception in thread &q ...
- NPOI读取Excel,导入数据到Excel练习01
NPOI 2.2.0.0,初级读取导入Excel 1.读取Excel,将数据绑定到dgv上 private void button1_Click(object sender, EventArgs e) ...
- sql 读取excel中的数据
select 列名 as 字段名 from openBowSet('MSDASQL.1','driver=Microsoft Excel Driver(*.xls);dbq=文件存放地址','sele ...
- PHP读取EXCEL时写入数据乱码解决办法
第一步排除excel读取的数据是不是乱码 EXCEL读取时经常会出现乱码,而我们常用的字符集是UTF-8 ,GB2312(GBK) ,这就需要对编码进行转换,但是又不能对纯数字和英文字符转换,否则会乱 ...
- 分享非常有用的Java程序(关键代码)(八)---Java InputStream读取网络响应Response数据的方法!(重要)
原文:分享非常有用的Java程序(关键代码)(八)---Java InputStream读取网络响应Response数据的方法!(重要) Java InputStream读取数据问题 ======== ...
随机推荐
- 已知有字符串foo=”get-element-by-id”,写一个function将其转化成驼峰表示法”getElementById”
题目:已知有字符串foo=”get-element-by-id”,写一个function将其转化成驼峰表示法”getElementById”. 代码: <!DOCTYPE html> &l ...
- CodeForces 659E New Reform
题意:给你一个无向图,如今要求你把边改成有向的. 使得入度为0的点最少,输出有多少个点入度为0 思路:脑补一波结论.假设有环的话显然没有点入度为0,其余则至少有一个点入度为0,然后就DFS一波就能够了 ...
- HBase 列族数量为什么越少越好
http://blog.csdn.net/r1soft/article/details/63253985 http://www.cnblogs.com/nucdy/p/5965113.html
- JQuery DataTables学习
1.Datatables简单介绍 DataTables是一个jQuery的表格插件.这是一个高度灵活的工具,根据的基础逐步增强,这将添加先进的互动控制.支持不论什么HTML表格. 主要特点: 自己主动 ...
- shell脚本通过ping命令来获取平均延时
#!/bin/bash #设置环境变量 PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin" exp ...
- CDN对于动态加速是否有效
CDN对于动态加速是否有效的问题.关于这个问题,一直存在一些分歧,部分人认为有效,部分人认为无效,主要是CDN技术也在更新,而且是比较低调的进行着更新,所以并不是所有人都清楚CDN对动态加速的效果.其 ...
- Django--基础补充
render 函数 在Django的使用中,render函数大多与浏览器发来的GET请求一并出现,它的使用方法非常简单 例如:render(request,"xxx.html",{ ...
- 点击单选button后的文字就可以选定相应单选button
比方我想点击单选button后的文字就选中对应的button: <input type="radio" name="sex" value="1& ...
- Away3D引擎学习笔记(二)CameraController相机控制的应用
cameraController---相机控制器 这里针对Away3D里面封装的CameraController的区别和使用做些简单介绍.相机控制器的设计思路比较清晰,所以难点东西不多.使用方面附上源 ...
- BMFont中文字体图集制作的方法~(for unity ngui)
BMFont中文字体图集制作的方法~(for unity ngui) 好吧~似乎这个问题困扰了很多人,游戏开始中文化是个不错的事儿啊,这里我就做下说明,如何制作中文字体图集~ 这里的字库图集的制作更多 ...