ByteBuffer и FileChannel читают только указанное количество байтов

У меня есть ситуация, когда я продолжаю читать с ByteBuffer, как показано ниже.

 ByteBuffer buffer = MappedByteBuffer.allocateDirect(Constants.BUFFER_SIZE);

Но когда чтение достигает границы (когда оставшиеся байты для чтения меньше BUFFER_SIZE), мне нужно прочитать только boundaryLimit - FileChannel's current position .

Означает, что граничный предел равен x, а текущие позиции - y, тогда мне нужно прочитать байты с y по x и не дальше этого.

Как мне этого добиться?

Я не хочу создавать еще один экземпляр с новой емкостью.


person nobody    schedule 06.10.2011    source источник
comment
Что вы подразумеваете под когда показания достигают границы?   -  person aioobe    schedule 06.10.2011
comment
Существует предел, до которого должно продолжаться только чтение. Байты после этого не должны быть прочитаны. Этот предел и есть граница. Обновленный вопрос   -  person nobody    schedule 06.10.2011


Ответы (2)


Использование здесь MappedByteBuffer вводит в заблуждение. Вы должны использовать

ByteBuffer buffer = ByteBuffer.allocateDirect(Constants.BUFFER_SIZE);

Если вы прочитали менее полного количества байтов, это не проблема.

channel.read(buffer);
buffer.flip();
// Will be between 0 and Constants.BUFFER_SIZE
int sizeInBuffer = buffer.remaining(); 

РЕДАКТИРОВАТЬ: читать из случайного места в файле.

RandomAccessFile raf = 
MappedByteBuffer buffer= raf.getChannel()
        .map(FileChannel.MapMode.READ_WRITE, start, length);
person Peter Lawrey    schedule 06.10.2011
comment
Это очень большой файл, и мне не нужны данные за пределами верхнего предела. На самом деле цель состоит в том, чтобы прочитать данные из указанной начальной позиции до указанной конечной позиции. - person nobody; 06.10.2011
comment
Существует гораздо более простое решение, если вы хотите прочитать/записать случайную область файла. Вы можете сделать его READ_ONLY или READ_WRITE. - person Peter Lawrey; 06.10.2011

На это нет ответа, кроме использования другого API, такого как FileInputStream, RandomAccessFile или MappedByteBuffer. Если вам нужно использовать ByteBuffer, вам просто нужно будет самостоятельно обнаружить перечитывание после того, как оно произойдет, и соответствующим образом компенсировать.

person user207421    schedule 07.10.2011