我有一个围绕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));
}
这不应该抛出异常,因为我还没有向缓冲区写任何内容吗?我做错了什么?
答案 0 :(得分:3)
当你创建一个ByteBuffer时,它充满了零。它充满了你为它创建的大小。如果要跟踪已写入的部分,则必须另外执行此操作,
我建议使用索引号而不是原始偏移量,您可以使用BitSet查看写入的部分。另一种方法是假设一条消息不会以nul
个字节开头,如果有,则表示它已损坏/不存在。
答案 1 :(得分:2)
新缓冲区的位置将为零,其限制将是其容量,其标记将未定义,并且其每个元素将初始化为零。
因此,即使你没有写入缓冲区,allocateDirect(...)
方法也有(在某种意义上)。
干杯,