byteBuffer的用法

一般可用bytebuffer来拼接字节数组

最近用SocketChannel进行网络编程比较多,中间也遇到了几个问题,出现的bug也主要来自于对于ByteBuffer的使用不当。现在终于调通了,对ByteBuffer及Socket网络编程也有了更深的认识,特此总结一下。

对于ByteBuffer主要需要注意的是几个标志的含义:position,limit,capability,mark.几个操作的影响:flip(),clear(),rewind().还有就是在读取或者写入时,标志的变化,比如get()方法导致position加1.

SocketChannel采用的是非阻塞异步读取流数据,在读取的时候,通常是

<ol class="linenums" style="border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:inherit; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:26px; vertical-align:baseline; list-style-position:initial"><li value="1" class="L0" style="border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:inherit; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline; list-style-type:decimal"><span class="typ" style="font-family:inherit;color:#66066;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">ByteBuffer</span><span class="pun" style="font-family:inherit;color:#66660;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">.</span><span class="pln" style="font-family:inherit;color:#000000;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">clear</span><span class="pun" style="font-family:inherit;color:#66660;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">();</span></li><li class="L1" style="border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:inherit; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline; list-style-type:decimal; background-color:rgb(238,238,238)"><span class="typ" style="font-family:inherit;color:#66066;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">SocketChannel</span><span class="pun" style="font-family:inherit;color:#66660;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">.</span><span class="pln" style="font-family:inherit;color:#000000;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">read</span><span class="pun" style="font-family:inherit;color:#66660;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">(</span><span class="typ" style="font-family:inherit;color:#66066;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">ByteBuffer</span><span class="pun" style="font-family:inherit;color:#66660;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">);</span></li></ol>

如果流中有数据,就会把数据从position开始读到ByteBuffer中,在读取之前ByteBuffer的clear操作会把position置为0,limit置为capability,也就是相当于清空了之前的内容,但是ByteBuffer中数组的内容在read之前是没有改变的.

read之后,通常就是开始从ByteBuffer中提取读到的数据,如果你的数据是以自己定义的数据包的格式进行发送的,那你还需要判断是否读到了数据包的结尾,因为对流数据本身来说是没有结尾这一说的。在提取数据之前,要先把position放到开始读取时的位置,把limit放到当前位置,所以要flip一下,表示从position到limit的位置都是需要的数据。

<ol class="linenums" style="border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:inherit; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:26px; vertical-align:baseline; list-style-position:initial"><li value="1" class="L0" style="border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:inherit; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline; list-style-type:decimal"><span class="typ" style="font-family:inherit;color:#66066;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">ByteBuffer</span><span class="pun" style="font-family:inherit;color:#66660;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">.</span><span class="pln" style="font-family:inherit;color:#000000;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">flip</span><span class="pun" style="font-family:inherit;color:#66660;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">();</span></li><li class="L1" style="border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:inherit; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline; list-style-type:decimal; background-color:rgb(238,238,238)"><span class="kwd" style="font-family:inherit;color:#0088;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">while</span><span class="pun" style="font-family:inherit;color:#66660;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">(</span><span class="typ" style="font-family:inherit;color:#66066;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">ByteBuffer</span><span class="pun" style="font-family:inherit;color:#66660;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">.</span><span class="pln" style="font-family:inherit;color:#000000;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">hasRemaining</span><span class="pun" style="font-family:inherit;color:#66660;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">()){</span></li><li class="L2" style="border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:inherit; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline; list-style-type:decimal"><span class="pln" style="font-family:inherit;color:#000000;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">	</span><span class="kwd" style="font-family:inherit;color:#0088;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">byte</span><span class="pln" style="font-family:inherit;color:#000000;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;"> c</span><span class="pun" style="font-family:inherit;color:#66660;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">=</span><span class="typ" style="font-family:inherit;color:#66066;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">ByteBuffer</span><span class="pun" style="font-family:inherit;color:#66660;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">.</span><span class="kwd" style="font-family:inherit;color:#0088;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">get</span><span class="pun" style="font-family:inherit;color:#66660;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">();</span></li><li class="L3" style="border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:inherit; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline; list-style-type:decimal; background-color:rgb(238,238,238)"><span class="pln" style="font-family:inherit;color:#000000;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">	</span><span class="kwd" style="font-family:inherit;color:#0088;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">if</span><span class="pln" style="font-family:inherit;color:#000000;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;"> </span><span class="pun" style="font-family:inherit;color:#66660;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">(</span><span class="pln" style="font-family:inherit;color:#000000;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">b </span><span class="pun" style="font-family:inherit;color:#66660;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">==</span><span class="pln" style="font-family:inherit;color:#000000;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;"> PACKAGE_END</span><span class="pun" style="font-family:inherit;color:#66660;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">)</span><span class="pln" style="font-family:inherit;color:#000000;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;"> </span><span class="pun" style="font-family:inherit;color:#66660;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">{</span></li><li class="L4" style="border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:inherit; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline; list-style-type:decimal"><span class="pln" style="font-family:inherit;color:#000000;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">		</span><span class="com" style="font-family:inherit;color:#8800;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">//you can return the package here</span></li><li class="L5" style="border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:inherit; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline; list-style-type:decimal; background-color:rgb(238,238,238)"><span class="pln" style="font-family:inherit;color:#000000;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">	</span><span class="pun" style="font-family:inherit;color:#66660;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">}</span><span class="kwd" style="font-family:inherit;color:#0088;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">else</span><span class="pun" style="font-family:inherit;color:#66660;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">{</span></li><li class="L6" style="border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:inherit; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline; list-style-type:decimal"><span class="pln" style="font-family:inherit;color:#000000;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">		</span><span class="com" style="font-family:inherit;color:#8800;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">//you can append the byte here.like StringBuilder.append().</span></li><li class="L7" style="border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:inherit; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline; list-style-type:decimal; background-color:rgb(238,238,238)"><span class="pln" style="font-family:inherit;color:#000000;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">	</span><span class="pun" style="font-family:inherit;color:#66660;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">}</span></li><li class="L8" style="border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:inherit; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline; list-style-type:decimal"><span class="pun" style="font-family:inherit;color:#66660;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">}</span></li></ol>

这样以来也存在一个问题,当一次读到的ByteBuffer不包含完整的数据包或者包含多个数据包.那么就需要在下一次继续把这些包分拆出来.那么在读取数据的代码处就可以改为,这样就把之前读取到的未完整的包保留了下来:

<ol class="linenums" style="border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:inherit; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:26px; vertical-align:baseline; list-style-position:initial"><li value="1" class="L0" style="border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:inherit; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline; list-style-type:decimal"><span class="kwd" style="font-family:inherit;color:#0088;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">if</span><span class="pun" style="font-family:inherit;color:#66660;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">(!</span><span class="typ" style="font-family:inherit;color:#66066;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">ByteBuffer</span><span class="pun" style="font-family:inherit;color:#66660;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">.</span><span class="pln" style="font-family:inherit;color:#000000;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">hasRemaining</span><span class="pun" style="font-family:inherit;color:#66660;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">){</span></li><li class="L1" style="border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:inherit; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline; list-style-type:decimal; background-color:rgb(238,238,238)"><span class="pln" style="font-family:inherit;color:#000000;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">	</span><span class="typ" style="font-family:inherit;color:#66066;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">ByteBuffer</span><span class="pun" style="font-family:inherit;color:#66660;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">.</span><span class="pln" style="font-family:inherit;color:#000000;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">clear</span><span class="pun" style="font-family:inherit;color:#66660;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">();</span></li><li class="L2" style="border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:inherit; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline; list-style-type:decimal"><span class="pln" style="font-family:inherit;color:#000000;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">	</span><span class="typ" style="font-family:inherit;color:#66066;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">SocketChannel</span><span class="pun" style="font-family:inherit;color:#66660;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">.</span><span class="pln" style="font-family:inherit;color:#000000;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">read</span><span class="pun" style="font-family:inherit;color:#66660;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">(</span><span class="typ" style="font-family:inherit;color:#66066;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">ByteBuffer</span><span class="pun" style="font-family:inherit;color:#66660;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">);</span></li><li class="L3" style="border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:inherit; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline; list-style-type:decimal; background-color:rgb(238,238,238)"><span class="pun" style="font-family:inherit;color:#66660;border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; outline-width:0px; outline-style:initial; outline-color:initial; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; vertical-align:baseline;">}</span></li></ol>

另外一个可能会用到的操作就是ByteBuffer.rewind(),他会把position置为0,limit保持不变,可以用于重复读取一段数据.

ByteBuffer是nio中一个非常方便的工具.设计思想也非常值得借鉴.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值