Память сопоставленного файла Java NIO - PullRequest
2 голосов
/ 03 февраля 2012

Я понимаю, как создать файл с отображением в памяти, но мой вопрос, скажем, в следующей строке:

FileChannel roChannel = new RandomAccessFile(file, "r").getChannel();
ByteBuffer roBuf = roChannel.map(FileChannel.MapMode.READ_ONLY, 0, SIZE);

Где я установил SIZE, например, 2 МБ, означает ли это, что это будеттолько загрузить 2 МБ файла или он будет читать дальше в файле и обновлять буфер, когда я беру из него байты?

Ответы [ 2 ]

4 голосов
/ 12 февраля 2012

Если я, например, установил SIZE равным 2 МБ, означает ли это, что он будет загружать только 2 МБ файла или будет читать дальше в файле и обновлять буфер, когда я получаю из него байты?

Будет загружена только часть файла, указанная при инициализации вашего буфера.Если вы хотите, чтобы он читал дальше, вам понадобится какой-то цикл чтения.Хотя я бы не сказал, что это сложно, если человек не на 100% знаком с задействованными API-интерфейсами java.io и java.nio, шансы на его наполнение высоки.(Например: не переворачивать буфер; ошибки в краях буфера / файла).

Если вы ищете простой способ доступа к этому файлу в ByteBuffer, рассмотрите возможность использования MappedByteBuffer.

RandomAccessFile raf = new RandomAccessFile(file, "r");
FileChannel fc = raf.getChannel();
MappedByteBuffer buffer = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());

Приятная вещь об использованииMBB в этом контексте заключается в том, что он не обязательно загружает весь буфер в память, а только части, к которым вы обращаетесь.

2 голосов
/ 03 февраля 2012

Размер буфера равен размеру, который вы передаете. Он не будет увеличиваться или уменьшаться.

Javadoc говорит:

Отображает область файла этого канала непосредственно в память.

...

размер - размер области для отображения; должен быть неотрицательным и не более Integer.MAX_VALUE

EDIT:

В зависимости от того, что вы подразумеваете под «обновляется новыми данными», ответ - да.

Вид файла, предоставленного экземпляром этого класса , гарантированно будет соответствовать другим представлениям того же файла, предоставленным другими экземплярами в той же программе. Представление, предоставляемое экземпляром этого класса, может, однако, соответствовать или не соответствовать представлениям других одновременно работающих программ из-за кэширования, выполняемого базовой операционной системой, и задержек, вызванных протоколами сетевой файловой системы. Это верно независимо от языка, на котором написаны эти другие программы, и от того, работают ли они на том же компьютере или на другом компьютере. Точная природа любых таких несоответствий зависит от системы и поэтому не указана.

Итак, другие системы могут выполнять кэширование, но когда эти кэши сброшены или обновлены иным образом, они согласятся с мнением, представленным FileChannel.

Вы также можете использовать явные вызовы метода position и других методов, чтобы изменить то, что представлено представлением.

Изменение позиции канала, явным образом, либо путем чтения или записи байтов, изменит позицию файла исходного объекта, и наоборот. Изменение длины файла через файловый канал изменит длину, видимую через исходный объект, и наоборот. Изменение содержимого файла путем записи байтов изменит содержимое, видимое исходным объектом, и наоборот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...