内蒙古java团队

j2se,j2ee开发组
posts - 139, comments - 212, trackbacks - 0, articles - 65
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

提高byte的效率

Posted on 2007-12-20 11:40 帅子 阅读(889) 评论(0)  编辑  收藏 所属分类: J2EE技术专区
在网络编程中,我们经常要组建自己的网络协议,通常我们把数据按照协议组成byte数组,通过byte数组实现客户端与服务器端的通信,我们可能通过两种方法来组这个byte数组:
1、是通过ByteArrayOutputStream:
ByteArrayOutputStream baos=new ByteArrayOutputStream();
baos.write(data.getBytes());
byte [] ret = baos.toByteArray();
2、是通过ByteBuffer:
在使用ByteBuffer时,我们要使用一个小技巧:因为我们发送的数据长度是不固定的,所以我们不能给ByteBuffer分配固定的容量,如果分配固定的容易,一方面可能造成内存的浪费,另外一方面有可能我们写的数据会超出ByteBuffer的容量。所以我们在申请ByteBuffer空间时,先计算其数据长度:
     如果是byte,short,int,long等类型的数据我们都好计算;
    如果是String的话,我们先获取其getBytes(),然后计算其长度。
例子:

                byte [] bs=null;
                byte len = 0;
                try {
                        bs="直播员".getBytes("GBK");
                        len = (byte) bs.length;
                } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                        return result;
                }
                short datalen=(short) (2+4+4+1+bs.length+4+4+4+1+1);//后续数据长度
                ByteBuffer w_buff = ByteBuffer.allocate(datalen+2);//申请ByteBuffer
                //接下来往ByteBuffer填充数据
                w_buff.putShort(Short.reverseBytes(datalen));
                short c=0X0416;
                w_buff.putShort(Short.reverseBytes(c));//登录命令号
                w_buff.putInt(Integer.reverseBytes(111));
                w_buff.putInt(Integer.reverseBytes(2222));
                
                w_buff.put(len);//昵称的长度
                w_buff.put(bs);//昵称
                w_buff.putInt(Integer.reverseBytes(1));//等级
                w_buff.putInt(Integer.reverseBytes(1));//用户权限
                w_buff.putInt(Integer.reverseBytes(1));//用户头像
                byte sex=0;
                w_buff.put(sex);//用户性别
                byte age=20;
                w_buff.put(age);//用户年龄
                byte [] ret=w_buff.array();

我个人比较喜欢用第二种方法,因为它的效率比第一种要高出一到两倍呢。
而且第二种方法可以不用自己去把short,int,long等类型的数据转换成byte数组(这可是以麻烦的过程呀)。

只有注册用户登录后才能发表评论。


网站导航: