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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

最近遇到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指向的位置执行的,如果没有步骤二,转码将从索引55,但这两个索引之间没有内容,所以

result += charBuffer.toString();

这一步将得到""),步骤三指向转码从索引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

你可能感兴趣的:(nio 中关于buff.reader()的用法)