0

我有一个 ByteBuffer 类的包装器(因为在我的代码中,它是实体的底层结构)。我想要一个 ByteBuffer 来存储固定大小的条目,如果我们尝试在没有写入任何内容的偏移量处读取,则返回 null 或抛出异常。我编写了以下代码:

private static final int SIZE = 16; //Bytes
private static final int BBSIZE = 48 * SIZE;
ByteBuffer blockMap = ByteBuffer.allocateDirect(BBSIZE);

byte[] readAtOffset(final int offset) throws BufferUnderflowException,  
                                             IndexOutOfBoundsException {
    byte[] dataRead = new byte[SIZE];
    blockMap.position(offset);
    blockMap.get(dataRead);
    return dataRead;
}

void writeAtOffset(final int offset, final byte[] data)
        throws BufferOverflowException, IndexOutOfBoundsException, ReadOnlyBufferException     
{
     if (data.length != SIZE) {
         throw new IllegalArgumentException("Invalid data received");
     }
     blockMap.position(offset);
     blockMap.put(data);
}


public static void main(String[] args) {
    ByteBufferTests tests = new ByteBufferTests();
    System.out.println("At 0: " + tests.readAtOffset(0));       
}

这不应该引发异常,因为我还没有向缓冲区写入任何内容吗?我究竟做错了什么?

4

2 回答 2

2

引用ByteBufferJavaDoc

新缓冲区的位置将为零,其限制将是其容量,其标记将是 undefined,并且其每个元素将被初始化为零。

因此,即使还没有写入缓冲区,该allocateDirect(...)方法也有(在某种意义上)。

干杯,

于 2013-08-20T09:26:13.687 回答
2

当您创建一个 ByteBuffer 时,它充满了零。它充满了您创建它的大小。如果要跟踪已写入的部分,则必须另外执行此操作,我建议使用索引号而不是原始偏移量,并且可以使用 BitSet 来查看已写入的部分。另一种方法是假设消息不会以nul字节开头,如果是,则它已损坏/不存在。

于 2013-08-20T09:39:05.393 回答