2014-12-11 3 views
0

У меня есть двоичный файл размером 10 МБ. Мне нужно прочитать его в кусках разного размера (например, 300, 273 байта). Для чтения я использую FileChannel и ByteBuffer. Прямо сейчас для каждой итерации чтения я выделяю новый размер ByteBuffer, который мне нужно прочитать.Чтение определенного количества байтов в ByteBuffer

Можно ли выделить только один раз (допустим, 200 КБ) для ByteBuffer и прочитать его (300, 273 байта и т. Д.)? Я не буду читать больше 200 КБ сразу. Весь файл должен быть прочитан.

UPD

public void readFile (FileChannel fc, int amountOfBytesToRead) 
{ 
    ByteBuffer bb= ByteBuffer.allocate(amountOfBytesToRead); 
    fc.read(bb); 
    bb.flip(); 
    // do something with bytes 
    bb = null; 
} 

Я не могу читать весь файл сразу из-за ограничений памяти. Вот почему я выполняю чтение в кусках. Эффективность также очень важна (поэтому я не хочу использовать свой текущий подход с несколькими распределениями). Спасибо

+0

Где моя попытка (код)? –

+1

Как выглядит ваш код? – Emz

+0

Вы хотите, чтобы вы прочитали 300 байт, затем 273 байта, затем байты XYZ из 'FileChannel', но только выделили' ByteBuffer' один раз? –

ответ

2

Сообщите вам об этом размере ByteBuffers и используйте функцию разбрасывания: read(ByteBuffer[] dsts, ...).

Или забудьте про NIO и используйте DataInputStream,readFully(). Если вы поместите BufferedInputStream под вами, вы не потерпите никаких потерь в производительности: это может быть даже быстрее.

+0

Я не хочу читать весь файл сразу. В моей программе я очень обеспокоен памятью и эффективностью. Выделение так много места приведет к сборке мусора (я хочу, чтобы избежать его). Многие распределения также являются дорогостоящими (с точки зрения эффективности) –

+0

Вы должны указать все эти дополнительные ограничения в своем вопросе. Но я ничего не говорил о том, чтобы распределять их повторно, и вы всего лишь упомянете 200kB за чтение, что не так уж много. – EJP

+0

@EJP Я не знал DataInputStream.readFully и контролировал его в вашем ответе. Поэтому я удалил свой суперплотный ответ. По крайней мере, я чему-то научился :) – Joachim

Смежные вопросы