当没有任何内容写入时,java中的ByteBuffer返回数据,不会抛出异常

时间:2013-08-20 09:16:42

标签: java arrays byte bytebuffer

我有一个围绕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));       
}

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

引用ByteBuffer JavaDoc

  

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

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

干杯,