Ну, я не вижу причин не использовать java.nio.MappedByteBuffer, даже если файлы больше Integer.MAX_VALUE.
Очевидно, вам не разрешат определять один MappedByteBuffer для всего файла.Но у вас может быть несколько MappedByteBuffers для доступа к различным областям файла.
Определение позиции и размера в FileChannenel.map имеет тип long, что подразумевает, что вы можете предоставить значения через Integer.MAX_VALUE, единственное, о чем вам нужно позаботиться, это то, что размер вашегобуфер не будет больше, чем Integer.MAX_VALUE.
Следовательно, вы можете определить несколько карт следующим образом:
buffer[0] = fileChannel.map(FileChannel.MapMode.READ_WRITE,0,2147483647L);
buffer[1] = fileChannel.map(FileChannel.MapMode.READ_WRITE,2147483647L, Integer.MAX_VALUE);
buffer[2] = fileChannel.map(FileChannel.MapMode.READ_WRITE, 4294967294L, Integer.MAX_VALUE);
...
Таким образом, размер не может быть больше, чем Integer.MAX_VALUE, но начальная позиция может быть где угодно в вашем файле.
В Книге Java NIO автор Рон Хитченс утверждает:
Доступ к файлу черезМеханизм отображения памяти может быть гораздо более эффективным, чем чтение или запись данных обычными средствами, даже при использовании каналов.Не нужно делать явных системных вызовов, что может занять много времени.Что еще более важно, система виртуальной памяти операционной системы автоматически кэширует страницы памяти.Эти страницы будут кэшироваться с использованием системной памяти и не будут занимать пространство из кучи памяти JVM.
Как только страница памяти станет действительной (введена с диска), к ней можно будет снова обращаться с полной аппаратной скоростью безнужно сделать еще один системный вызов, чтобы получить данные.Большие структурированные файлы, содержащие индексы или другие разделы, на которые часто ссылаются или которые часто обновляются, могут значительно выиграть от сопоставления памяти.В сочетании с блокировкой файлов для защиты критических секций и управления атомарностью транзакций вы начинаете понимать, как можно эффективно использовать буферы отображения памяти.
Я действительно сомневаюсь, что вы найдете сторонний APIделать что-то лучше, чем это.Возможно, вы найдете API, написанный поверх этой архитектуры, чтобы упростить работу.
Не думаете ли вы, что этот подход должен работать для вас?