ByteBuffer в java, возвращающий данные, когда в него ничего не записывается, не генерирует исключение

У меня есть оболочка вокруг класса 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));       
}

Разве это не должно вызвать исключение, поскольку я еще ничего не записал в буфер? Что я делаю неправильно?


person user1071840    schedule 20.08.2013    source источник
comment
ByteBuffer уже имеет массив байтов; нет необходимости заполнять (записывать) его.   -  person Joop Eggen    schedule 20.08.2013
comment
Если вы хотите получить данные из ByteBuffer, вы должны сначала flip его.   -  person user207421    schedule 20.08.2013
comment
Мне нужно перевернуть? Я позиционирую текущее местоположение каждый раз.   -  person user1071840    schedule 20.08.2013


Ответы (2)


Когда вы создаете ByteBuffer, он заполнен нулями. Он полон того размера, для которого вы его создаете. Если вы хотите отслеживать, в какие части вы записали, вы должны сделать это дополнительно, я предлагаю использовать номер индекса вместо необработанного смещения, и вы можете использовать BitSet, чтобы увидеть, в какие части была записана. В качестве альтернативы можно предположить, что сообщение не будет начинаться с nul байт, а если и будет, то оно повреждено/отсутствует.

person Peter Lawrey    schedule 20.08.2013