Я предпочитаю использовать сопоставление памяти.
FileChannel channel = new FileInputStream(fileName).getChannel();
ByteBuffer buf = channel.map(MapMode.READ_ONLY,0,channel.size());
Если размер файла превышает 2 ГБ, необходимо иметь более одного сопоставления.С положительной стороны это занимает около 10 мс независимо от размера и не использует много кучи или прямой памяти независимо от размера файла.