bytebuffer的心得.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
bytebuffer的心得

在NIO中,数据的读写操作始终是与缓冲区相关联的读取时信道(SocketChannel)将数据读入缓冲区,写入时首先要将发送的数据按顺序填入缓冲区缓冲区是定长的,基本上它只是一个列表,它的所有元素都是基本数据类型 getBytes就可以了). Nio缓冲区的7种形式 ByteBuffer? ShortBuffer?   IntBuffer?   CharBuffer?   FloatBuffer?   DoubleBuffer?   LongBuffer? ByteBuffer是最常用的缓冲区,它提供了读写其他数据类型的方法,且信道的读写方法只接收ByteBufferByteBuffer的属性中:有以下3种常见属性 m:mark:初始值为-1,标记索引地点 p:position:初始值为0,索引下标 l:limit:最好定义成bytebuffer的长度,即允许可读空间长度 c:capacity:缓冲区能容纳的数据元素的最大数量,创建之后无法被改变 总的关系mplc 创建ByteBuffer 1.1 使用allocate()静态方法创建一个容量为256字节的ByteBuffer,ByteBuffer buffer=ByteBuffer.allocate(256); 参数为ByteBuffer的长度,这个一定要在前期设计时考虑充足,不然就得重新创建 创建其他缓冲区也是这样的静态方法创建的Buffer父类引用对象 。 1.2 通过包装一个已有的数组来创建如下,通过包装的方法创建的缓冲区保留了被包装数组内保存的数据. ??? ByteBuffer buffer=ByteBuffer.wrap(byteArray);wrap(int[]?array, int?offset, int?length) 无论要使用的子数组的偏移量offset 子数组的长度length ?如果要将一个字符串存入ByteBuffer,可以如下操作: ??? String sendString=你好,服务器. ; ??? ByteBuffer sendBuffer=ByteBuffer.wrap(sendString.getBytes(UTF-8)); //从ByteBuffer中读出String Charset cs = Charset.forName (UTF-8); byte[] bs = new byte[sendBuffer. limit()]; sendBuffer.get(bs); String news = new String(bs, cs); //String news = new String(sendBuffer.array(), cs); 注释里的方法也是可行,只是要注意array()方法不是将Byte中position到limit段的byte[]数组输出,而是输出缓存区所有的byte[]数组!包括limit之后的! 2.回绕缓冲区 ? buffer.flip(); byte[] data = new byte[buffer.remaining()]; buffer.get(data); // session开始写入数据 WriteFuture writeFuture = session.write(data); ? 这个方法用来将缓冲区准备为数据传出状态,执行以上方法后,输出通道会从数据的开头而不是末尾开始.回绕保持缓冲区中的数据不变,只是准备写入而不是读取. 3.清除缓冲区 ? buffer.clear(); ? 这个方法实际上也不会改变缓冲区的数据,而只是简单的重置了缓冲区的主要索引值.不必为了每次读写都创建新的缓冲区,那样做会降低性能.相反,要重用现在的缓冲区,在再次读取之前要清除缓冲区.position=0的过程 以下为常用方式 4.从套接字通道(信道)读取数据 ?SocketChannel采用的是非阻塞异步读取流数据,在读取的时候,通常是 ByteBuffer.clear(); SocketChannel.read(ByteBuffer);执行以上方法后,通道会从socket读取的数据填充此缓冲区,它返回成功读取并存储在缓冲区的字节数.在默认情况下,这至少会读取一个字节,或者返回-1指示数据结束.如果流中有数据,就会把数据从position开始读到ByteBuffer中,在读取之前ByteBuffer的clear操作会把position置为0,limit置为capability,也就是相当于清空了之前的内容,但是ByteBuffer中数组的内容在read之前是没有改变的. read之后,通常就是开始从ByteBuffer中提取读到的数据,如果你的数据是以自己定义的数据包的格式进行发送

文档评论(0)

yaobanwd + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档