ByteBuffer и FileChannel читают только указанное количество байтов - PullRequest
2 голосов
/ 06 октября 2011

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

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 06 октября 2011

Вводить в заблуждение использование 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);
0 голосов
/ 07 октября 2011

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

...