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指向的位置执行的,如果没有步骤二,转码将从索引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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值