ByteBuffer bb = ByteBuffer.allocate(BSIZE);
    bb.asCharBuffer().put("Howdy!");
    char c;
    while((c = bb.getChar()) != 0)
     System.out.print(c + " ");
bb.rewind();
    // Store and read a short:
    bb.asShortBuffer().put((short)471142);
    System.out.println(bb.getShort());
    bb.rewind();
    // Store and read an int:
    bb.asIntBuffer().put(99471142);
    System.out.println(bb.getShort());
    bb.rewind();
为什么bb.getChar()一次只能获得一个英文字母
而bb.getShort(),bb.getShort()一次就能获得放入的数字
而API中他们的定义都是:
读取此缓冲区的当前位置之后的两个字节,根据当前的字节顺序将它们组成 short(或char或int) 值,然后将该位置增加 2
怎么结果不是类似的
还有,ByteBuffer是抽象类,它的get,put方法都是抽象的,怎么可以返回值?

解决方案 »

  1.   

    关键是要看它是怎样 put 进去的,可以看一下 putChar() (在 java.nio.Bits 类中) 的源代码:static void putChar(ByteBuffer bb, int bi, char x, boolean bigEndian) {
      if (bigEndian)
        putCharB(bb, bi, x);
      else
        putCharL(bb, bi, x);
    }static void putCharB(ByteBuffer bb, int bi, char x) {
      bb._put(bi + 0, char1(x));
      bb._put(bi + 1, char0(x));
    }static void putCharL(ByteBuffer bb, int bi, char x) {
      bb._put(bi + 0, char0(x));
      bb._put(bi + 1, char1(x));
    }private static byte char1(char x) { return (byte)(x >> 8); }
    private static byte char0(char x) { return (byte)(x >> 0); }从上面的源代码可以看出,它每次存放的都是两个字节,不管其是英文字符还是其他的字符。另:ByteBuffer 的实现类是 HeapByteBuffer,是一个无修饰关键字的类,不在 JDK API 帮助中存在。
      

  2.   

    应该是内部的实现机制的问题,getchar应该是指读入一个字节,而getshort应该是读入一个字符串
      

  3.   

    因为 ByteBuffer 是一个抽象类,也就是说不能生成对象的。它的对象是由其 allocate() 的静态方法生成的。那就可以到 JDK 的源代码中找到这个类和这个方法,就可以知道它 return 的类型了。另:JDK 的源代码在你 JDK 安装好的的目录下有个 src.zip 的文件,解开来就是 JDK 的源代码了。
      

  4.   

    如果用打印getChar的方式来打印getShort:
    bb.asShortBuffer().put((short)471142);
    short c;
    while((c = bb.getShort()) != 0)
    System.out.print(c + " ");
    这样的输出结果是
    12390 111 119 100 121 33
    我怎么看都没法在二进制数中找到关系
    这是怎么得来的?
      

  5.   

    12390 — 由于 471142 已经超过了 short 的最大值(32767)产生溢出,int 占 8 个字节 32 位,而 short 占 4 个字节 16 位,强制转换只取低 16 位,高 16 溢出扔掉了。得出值应为 471142 & 0xffff 就是 12390 了。不知道你的后面怎么还有其他的输出,我的机器上只输出“12390”。
      

  6.   

    回复人:fengmingjie(木林森) ( 五级(中级)) 信誉:100  2007-07-16 12:56:10  得分:0
     
    应该是内部的实现机制的问题,getchar应该是指读入一个字节,而getshort应该是读入一个字符串=======================================================================================
    getChar 读取的是一个字符,而不是字节。
    getShort 读取 short 类型的值,而不是字符串
      

  7.   

    我看了ByteBuffer的源代码,除了在开头的注释里面说明了是用Heap-x-Buffer实现外
    并没有看见代码中哪里有交给HeapByteBuffer实现的代码
      

  8.   

    啊~~,我的 JDK 源码里 ByteBuffer 的 allocate 就是直接 return 一个 HeapByteBuffer 对象的!难道是版本关系?我的版本是 JDK 1.5.0_03-b07。
      

  9.   

    我 找到了
    还有,说明一点
    用eclipse打开源代码方便些