0

我有一堂课如下:

final ByteBuffer data;

1st_constructor(arg1, arg2, arg3){
    data = ByteBuffer.allocate(8);   
    // Use "put" method to add values to the ByteBuffer
    //.... eg: 2 ints
    //....
    data.flip();
}

1st_constructor(arg1, arg2){
    data = ByteBuffer.allocate(12);  
    // Use "put" method to add values to the ByteBuffer
    //.... eg: 3 ints
    //....  
    data.flip()
}

在我的主类中,我创建了一个名为“data_packet”的类的实例,并将 ByteBuffer“数据”的内容存储到 byte[] 中。

data_packet.data.get(buf,0,buf.length);

随后,当我使用:

data_packet.data.getInt();

我得到一个“BufferUnderFlow 异常”。但是,如果我在使用 getInt() 之前再次翻转缓冲区,它就可以正常工作。

所以我的问题是,为什么我需要再次翻转缓冲区?它不是已经设置为在构造函数中读取吗?

谢谢你。

4

1 回答 1

0

flip 用于将 ByteBuffer 从“读”(putting)翻转到“写”(getting):在一系列 put 用于填充 ByteBuffer 后,flip 会将缓冲区的限制设置为当前位置并重置位置为零。这具有使将来从缓冲区获取或写入的效果,将所有放入缓冲区的内容写入缓冲区,仅此而已。

完成 put 后​​,您可能希望重用 ByteBuffer 来构造另一个数据结构。要“取消翻转”它,请调用重置。这会将限制重置为容量(使所有缓冲区都可用),并将位置重置为 0。

于 2013-06-01T06:39:44.360 回答