nio|nio 中关于buff.reader()的用法

2019独角兽企业重金招聘Python工程师标准>>> nio|nio 中关于buff.reader()的用法
文章图片

最近遇到nio但是在从通道往ByteBuffer 中读取内容的时候总是得不到想要的,如设置
ByteBuffer buf = ByteBuffer.allocate(5); 我输入abcdefg七个字母,但是得到的是cde,后来发现是buf.clear()用的不对
以下面代码为例

ByteBuffer buf = ByteBuffer.allocate(5); int temp = 0; while((temp = socket.read(buf))>0){//步骤一,buf.position 将会设置成读入字符的长度 buf.flip(); //步骤二,buf.limit=buf.position,buf.position=0, Charset charset = Charset.forName("us-ascii"); CharsetDecoder decoder = charset.newDecoder(); CharBuffer charBuffer = decoder.decode(buf); //步骤三,buf.position=buf.limit result += charBuffer.toString(); buf.clear(); //步骤四,buf.position = 0,buf.limit = buf的初始长度 }

假设输入的是abcdefg,在执行到步骤一之前,buf.position=0,buf.limit =5,执行完之后buf.position = 5; 步骤二将buf.position设置成了0(因为在步骤三转码的时候是从buf.position指向的位置执行的,如果没有步骤二,转码将从索引5到5,但这两个索引之间没有内容,所以
result += charBuffer.toString();

【nio|nio 中关于buff.reader()的用法】这一步将得到""),步骤三指向转码从索引0到索引5,转码后得到abcde,并将position从0变成5,执行步骤四,再次将postion变成0,limit变成了5(如果没有这一步,步骤一将从索引5到5放要读的内容,显然从5到5之间放不了东西所以就不读了)之所以会出现开头说的情况是因为缺少步骤二,步骤一读入前五个字符,buf的position没有重设为0,步骤三也无法对读入的内容进行转码,result便仍是空串,再次执行步骤一,由于步骤四使position=0,所以这次读入了fg,position被设置成了2,此时buf里的存储的值为fgcde(因为buf.clear()方法并不清楚内容只是更改索引的位置),步骤三转码从position=2开始,所以转码后得到的字符是cde,所以最终结果就是cde。


转载于:https://my.oschina.net/u/1421583/blog/298640

    推荐阅读