1. 转:https://zhidao.baidu.com/question/427134449349230532.html
    说道 ByteBuffer的缓冲区,就需要知道缓冲区的的三个状态

    1)capacity 即容量,也就是缓冲区的大小。它的值是在创建缓冲区的时候指定的,设定后无法对其进行修改。
    2)limit 读写限制:也就是缓冲区可以利用(进行读写)的范围的最大值,可以调用ByteBuffer对象的limit(int)方法进行设置,
    调用ByteBuffer对象的limit()获取缓冲区读写限制的大小;在刚开始创建缓冲区的时候limit的大小等于capacity
    3)position 读写位置:表示当前进行读写操作时的位置,初始化为0,即缓冲区开始读或者写数据的位置。
    可以通过调用ByteBuffer对象的positonint)方法设置它的值,通过position()可以获取它的值
  2.  
  3. 这三个状态的数值满足一下关系:0=<position=<limit=<capacity
  4.  
  5. 在初始化缓冲区的情况下,position=0;limit = capacity
  6.  
  7. 缓冲区是通过put或者putXXX来向缓冲区添加数据,也可以通过put(index,vlaue)方法在指定的positionlimit之间指定的地方添加数据;
    通过get()或者getXXX()来获取数据,也可以通过get(int index)方法来获取positionlimit之间指定的数据。
    注意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方法就可以获取到0limit之间的数据了
  8. 以下代码修改至 http://www.cnblogs.com/guazi/p/6474757.html
  1. public static void main(String[] args) {
  2. ByteBuffer buff = ByteBuffer.allocate();
  3. String str = "helloWorld";
  4. buff.put(str.getBytes());
  5. System.out.println(new String(buff.array()));
  6. System.out.println("position:" + buff.position() + "\t limit:"
  7. + buff.limit() + "\t capacity:" + buff.capacity());
  8. // 读取两个字节byte[] abytes = new byte[1];
  9. byte[] abytes = new byte[];
  10. buff.get(abytes);
  11. System.out.println("get one byte to string:" + new String(abytes));
  12. // Reads the byte at this buffer's current position, and then increments
  13. // the position.
  14. buff.get();
  15. System.out.println("获取两个字节(两次get()方法调用)后");
  16. System.out.println("position:" + buff.position() + "\t limit:"
  17. + buff.limit());
  18. // Sets this buffer's mark at its position. like
  19. // ByteBuffer.this.mark=position
  20. buff.mark();
  21. System.out.println("mark()...");
  22. System.out.println("position:" + buff.position() + "\t limit:"
  23. + buff.limit());
  24.  
  25. // 当读取到码流后,进行解码。首先对ByteBuffer进行flip操作,
  26. // 它的作用是将缓冲区当前的limit设置为position,position设置为0
  27. // flip方法将Buffer从写模式切换到读模式。调用flip()方法会将position设回0,并将limit设置成之前position的值。
  28. buff.flip();
  29. System.out.println("flip()...");
  30. System.out.println("position:" + buff.position() + "\t limit:"
  31. + buff.limit() + "\t capacity:" + buff.capacity());
  32.  
  33. byte[] tbyte = new byte[buff.limit()];
  34. buff.get(tbyte);
  35. System.out.println("get one byte to string:" + new String(tbyte));
  36. System.out.println("position:" + buff.position() + "\t limit:"
  37. + buff.limit());
  38. if (buff.hasRemaining()) {
  39. buff.compact();
  40. } else {
  41. buff.clear();
  42. }
  43. }
  1.  

还有几个关于这个的,感觉写的还可以:

http://blog.csdn.net/shuaiawp/article/details/51915983

http://www.cnblogs.com/xiaoluo501395377/archive/2012/10/30/2747001.html

  1.  

读取ByteBuffer有效的数据的更多相关文章

  1. 一个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 ...

  2. Python中如何读取xls中的数据

    要想读取EXCEL中的数据,首先得下载xlrd包,地址:https://pypi.python.org/pypi/xlrd  安装方法:下载解压后,利用windows  dos命令进入解压目录eg,c ...

  3. 编写SqlHelper使用,在将ExecuteReader方法封装进而读取数据库中的数据时会产生Additional information: 阅读器关闭时尝试调用 Read 无效问题,解决方法与解释

    在自学杨中科老师的视频教学时,拓展编写SqlHelper使用,在将ExecuteReader方法封装进而读取数据库中的数据时 会产生Additional information: 阅读器关闭时尝试调用 ...

  4. 读取、写入excel数据

    在实际项目中,不可避免的会操作excel表格.一直以来都是读取excel表格,可今天为了写入excel表格,可是煞费苦心,终于完成,记录下来以便后续使用. 1.读取excel表格的数据 读取excel ...

  5. 读取redis中的数据时出现:MISCONF Redis is configured to save RDB snapshots

    读取redis中的数据时出现:MISCONF Redis is configured to save RDB snapshots   以下为异常详细信息: Exception in thread &q ...

  6. NPOI读取Excel,导入数据到Excel练习01

    NPOI 2.2.0.0,初级读取导入Excel 1.读取Excel,将数据绑定到dgv上 private void button1_Click(object sender, EventArgs e) ...

  7. sql 读取excel中的数据

    select 列名 as 字段名 from openBowSet('MSDASQL.1','driver=Microsoft Excel Driver(*.xls);dbq=文件存放地址','sele ...

  8. PHP读取EXCEL时写入数据乱码解决办法

    第一步排除excel读取的数据是不是乱码 EXCEL读取时经常会出现乱码,而我们常用的字符集是UTF-8 ,GB2312(GBK) ,这就需要对编码进行转换,但是又不能对纯数字和英文字符转换,否则会乱 ...

  9. 分享非常有用的Java程序(关键代码)(八)---Java InputStream读取网络响应Response数据的方法!(重要)

    原文:分享非常有用的Java程序(关键代码)(八)---Java InputStream读取网络响应Response数据的方法!(重要) Java InputStream读取数据问题 ======== ...

随机推荐

  1. 【转载】深入理解JVM性能调优

    性能问题无非就这么几种:CPU.内存.磁盘IO.网络.那我们来逐一介绍以下相关的现象和一些可能出现的问题. 一.CPU过高. 查看CPU最简单的我们使用任务管理器查看,如下图所示,windows下使用 ...

  2. ionic中actionsheet在安卓中显示样式问题

    可以看到在浏览器上是正常的,在安卓上的样式没了 建议不要直接去动ionic的css文件,容易影响全局 方法:注释掉_action-sheet.sass中文件123行,针对安卓样式去写的样sass 保存 ...

  3. 使用lua扩展应用程序

    全局变量的操作 void lua_getglobal(lua_State * L ,const char * name) 此函数从lua中取出一个名为name的全局变量并将其压入栈中. 如当lua文件 ...

  4. HTML5+CSS3学习笔记(一) 概述

    HTML5+CSS3概述      HTML5和CSS3不仅仅是两项新的Web技术标准,更代表了下一代HTML和CSS技术.虽然HTML5的标准规范还没有正式发布,但是未来的发展前景已经可以预见,那就 ...

  5. java模拟异步消息的发送与回调

      http://kt8668.iteye.com/blog/205739 本文的目的并不是介绍使用的什么技术,而是重点阐述其实现原理. 一. 异步和同步 讲通俗点,异步就是不需要等当前执行的动作完成 ...

  6. Android提供支持不同屏幕大小的各种方法

    1 http://blog.csdn.net/guolin_blog/article/details/8830286  (手机平板,通过large-layout来区分两条布局文件) 2 http:// ...

  7. android ListView滚动条监听判断滚动到底部还是顶部

    代码: lv.setOnScrollListener(new OnScrollListener() { public void onScrollStateChanged(AbsListView vie ...

  8. poj 3468 A Simple Problem with Integers 【线段树-成段更新】

    题目:id=3468" target="_blank">poj 3468 A Simple Problem with Integers 题意:给出n个数.两种操作 ...

  9. Hibernate学习之二级缓存

    © 版权声明:本文为博主原创文章,转载请注明出处 二级缓存 - 二级缓存又称“全局缓存”.“应用级缓存” - 二级缓存中的数据可适用范围是当前应用的所有会话 - 二级缓存是可插拔式缓存,默认是EHCa ...

  10. linux内核中mtd架构分析

    一. 引言 MTD(memory technology device内存技术设备)是用于访问memory设备(RAM.ROM.flash)的Linux的子系统.MTD的主要目的是为了使新的memory ...