Класс MappedByteBuffer
- Все реализованные интерфейсы:
Comparable<ByteBuffer>
public abstract sealed class MappedByteBuffer extends ByteBuffer
Отображённые буферы байтов создаются с помощью метода FileChannel.map. Этот класс расширяет класс ByteBuffer, добавляя операции, предназначенные для отображённых в память областей файлов.
Отображённый буфер байтов и соответствующее ему отображение файла остаются действительными до тех пор, пока сам буфер не будет удалён сборщиком мусора.
Содержимое отображённого буфера байтов может измениться в любой момент, например, если содержимое соответствующей области отображённого файла изменит эта программа или другая программа. Произойдут ли такие изменения и когда именно, зависит от операционной системы и поэтому не определено.
Весь отображённый буфер байтов или его часть могут в любой момент стать недоступными, например, если отображённый файл будет усечён. Попытка доступа к недоступной области отображённого буфера байтов не изменит содержимое буфера и приведёт к выбрасыванию исключения неопределённого типа либо во время доступа, либо позднее. Поэтому настоятельно рекомендуется принимать надлежащие меры предосторожности, чтобы эта программа или одновременно выполняющаяся программа не изменяла отображённый файл, за исключением чтения или записи его содержимого.
В остальном отображённые буферы байтов ведут себя так же, как обычные прямые буферы байтов.
- Начиная с версии:
- 1.4
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
final MappedByteBuffer |
clear() |
Очищает этот буфер. |
abstract MappedByteBuffer |
compact() |
Уплотняет этот буфер (необязательная операция). |
abstract MappedByteBuffer |
duplicate() |
Создаёт новый буфер байтов, совместно использующий содержимое этого буфера. |
final MappedByteBuffer |
flip() |
Переводит этот буфер в режим чтения. |
final MappedByteBuffer |
force() |
Принудительно записывает все изменения содержимого этого буфера на устройство хранения, содержащее отображённый файл. |
final MappedByteBuffer |
force |
Принудительно записывает все изменения области содержимого этого буфера на устройство хранения, содержащее отображённый файл. |
final boolean |
isLoaded() |
Показывает, находится ли содержимое этого буфера в физической памяти. |
final MappedByteBuffer |
limit |
Устанавливает предел этого буфера. |
final MappedByteBuffer |
load() |
Загружает содержимое этого буфера в физическую память. |
final MappedByteBuffer |
mark() |
Устанавливает отметку этого буфера в его текущей позиции. |
final MappedByteBuffer |
position |
Устанавливает позицию этого буфера. |
final MappedByteBuffer |
reset() |
Возвращает позицию этого буфера к ранее отмеченной позиции. |
final MappedByteBuffer |
rewind() |
Перематывает этот буфер. |
abstract MappedByteBuffer |
slice() |
Создаёт новый буфер байтов, содержимым которого является совместно используемая подпоследовательность содержимого этого буфера. |
abstract MappedByteBuffer |
slice |
Создаёт новый буфер байтов, содержимым которого является совместно используемая подпоследовательность содержимого этого буфера. |
Методы, объявленные в классе ByteBuffer
alignedSlice, alignmentOffset, allocate, allocateDirect, array, arrayOffset, asCharBuffer, asDoubleBuffer, asFloatBuffer, asIntBuffer, asLongBuffer, asReadOnlyBuffer, asShortBuffer, compareTo, equals, get, get, get, get, get, get, getChar, getChar, getDouble, getDouble, getFloat, getFloat, getInt, getInt, getLong, getLong, getShort, getShort, hasArray, hashCode, isDirect, mismatch, order, order, put, put, put, put, put, put, put, put, putChar, putChar, putDouble, putDouble, putFloat, putFloat, putInt, putInt, putLong, putLong, putShort, putShort, toString, wrap, wrap
Методы, объявленные в классе Buffer
capacity, hasRemaining, isReadOnly, limit, position, remaining
Подробное описание методов
isLoaded
public final boolean isLoaded()
Возвращаемое значение true означает, что весьма вероятно, что все данные этого буфера находятся в физической памяти и поэтому могут быть доступны без возникновения ошибок страниц виртуальной памяти или операций ввода-вывода. Возвращаемое значение false не обязательно означает, что содержимое буфера не находится в физической памяти.
Возвращаемое значение является подсказкой, а не гарантией, поскольку базовая операционная система могла выгрузить часть данных буфера на диск к моменту возврата этого метода.
- Возвращает:
-
true, если содержимое этого буфера, вероятно, находится в физической памяти
load
public final MappedByteBuffer load()
Этот метод прилагает все усилия, чтобы к моменту возврата содержимое этого буфера находилось в физической памяти. Вызов этого метода может привести к возникновению некоторого количества ошибок страниц и операций ввода-вывода.
- Возвращает:
- Этот буфер
force
public final MappedByteBuffer force()
capacity() байт. Вызов этого метода действует точно так же, как вызов force(0,capacity()). Если файл, отображённый в этот буфер, находится на локальном устройстве хранения, то при возврате этого метода гарантируется, что все изменения, внесённые в буфер с момента его создания или с момента последнего вызова этого метода, будут записаны на это устройство.
Если файл находится не на локальном устройстве, такая гарантия не предоставляется.
Если этот буфер не был отображён в режиме чтения-записи (FileChannel.MapMode.READ_WRITE), вызов этого метода может не оказать никакого эффекта. В частности, метод не оказывает эффекта для буферов, отображённых в режимах только для чтения или частного отображения. Этот метод может оказывать или не оказывать эффект для режимов отображения, зависящих от реализации.
- Возвращает:
- Этот буфер
- Выбрасывает:
-
UncheckedIOException— если при записи содержимого буфера на устройство хранения, содержащее отображённый файл, возникает ошибка ввода-вывода
force
public final MappedByteBuffer force(int index, int length)
index в этом буфере и имеет размер length байт. Если файл, отображённый в этот буфер, находится на локальном устройстве хранения, то при возврате этого метода гарантируется, что все изменения выбранной области буфера, внесённые с момента его создания или с момента последнего вызова этого метода, будут записаны на это устройство. Операция принудительной записи может записывать байты за пределами указанной области, например, чтобы обеспечить передачу блоков данных целиком с учётом особенностей конкретного устройства.
Если файл находится не на локальном устройстве, такая гарантия не предоставляется.
Если этот буфер не был отображён в режиме чтения-записи (FileChannel.MapMode.READ_WRITE), вызов этого метода может не оказать никакого эффекта. В частности, метод не оказывает эффекта для буферов, отображённых в режимах только для чтения или частного отображения. Этот метод может оказывать или не оказывать эффект для режимов отображения, зависящих от реализации.
- Параметры:
-
index— индекс первого байта области буфера, которую необходимо записать в хранилище; должен быть неотрицательным и меньшеcapacity() -
length— длина области в байтах; должна быть неотрицательной и не превышатьcapacity() - index - Возвращает:
- Этот буфер
- Выбрасывает:
-
IndexOutOfBoundsException— если предварительные условия для индекса и длины не выполнены. -
UncheckedIOException— если при записи содержимого буфера на устройство хранения, содержащее отображённый файл, возникает ошибка ввода-вывода - Начиная с версии:
- 13
position
public final MappedByteBuffer position(int newPosition)
- Переопределяет:
-
positionв классеByteBuffer - Параметры:
-
newPosition— новое значение позиции; должно быть неотрицательным и не превышать текущий предел - Возвращает:
- Этот буфер
- Начиная с версии:
- 9
limit
public final MappedByteBuffer limit(int newLimit)
- Переопределяет:
-
limitв классеByteBuffer - Параметры:
-
newLimit— новое значение предела; должно быть неотрицательным и не превышать ёмкость этого буфера - Возвращает:
- Этот буфер
- Начиная с версии:
- 9
mark
public final MappedByteBuffer mark()
- Переопределяет:
-
markв классеByteBuffer - Возвращает:
- Этот буфер
- Начиная с версии:
- 9
reset
public final MappedByteBuffer reset()
Вызов этого метода не изменяет и не сбрасывает значение отметки.
- Переопределяет:
-
resetв классеByteBuffer - Возвращает:
- Этот буфер
- Начиная с версии:
- 9
clear
public final MappedByteBuffer clear()
Вызовите этот метод перед заполнением буфера последовательностью операций чтения из канала или операций put. Например:
buf.clear(); // Prepare buffer for reading
in.read(buf); // Read data
Этот метод фактически не стирает данные в буфере, но называется именно так, поскольку обычно используется в ситуациях, когда результат практически тот же, как если бы данные были стёрты.
- Переопределяет:
-
clearв классеByteBuffer - Возвращает:
- Этот буфер
- Начиная с версии:
- 9
flip
public final MappedByteBuffer flip()
После последовательности операций чтения из канала или операций put вызовите этот метод, чтобы подготовить буфер к последовательности операций записи в канал или относительных операций get. Например:
buf.put(magic); // Prepend header
in.read(buf); // Read data into rest of buffer
buf.flip(); // Flip buffer
out.write(buf); // Write header + data to channel
Этот метод часто используется вместе с методом compact при передаче данных из одного места в другое.
- Переопределяет:
-
flipв классеByteBuffer - Возвращает:
- Этот буфер
- Начиная с версии:
- 9
rewind
public final MappedByteBuffer rewind()
Вызовите этот метод перед последовательностью операций записи в канал или операций get, предполагая, что предел уже установлен надлежащим образом. Например:
out.write(buf); // Write remaining data
buf.rewind(); // Rewind buffer
buf.get(array); // Copy data into array
- Переопределяет:
-
rewindв классеByteBuffer - Возвращает:
- Этот буфер
- Начиная с версии:
- 9
slice
public abstract MappedByteBuffer slice()
Содержимое нового буфера будет начинаться с текущей позиции этого буфера. Изменения содержимого этого буфера будут видны в новом буфере, и наоборот; значения позиции, предела и отметки двух буферов будут независимы.
Позиция нового буфера будет равна нулю, его ёмкость и предел будут равны числу оставшихся в этом буфере байтов, его отметка не будет определена, а порядок байтов будет BIG_ENDIAN. Новый буфер будет прямым тогда и только тогда, когда прямым является этот буфер, и будет доступен только для чтения тогда и только тогда, когда этот буфер доступен только для чтения.
Чтение байтов в физическую память при вызове load() для возвращённого буфера или запись байтов на устройство хранения при вызове force() для возвращённого буфера будут действовать только на поддиапазон этого буфера, представленный возвращённым буфером, а именно [position(),limit()).
- Определено в:
-
sliceв классеByteBuffer - Возвращает:
- Новый буфер байтов
- Начиная с версии:
- 17
- См. также:
slice
public abstract MappedByteBuffer slice(int index, int length)
Содержимое нового буфера будет начинаться с позиции index в этом буфере и включать length элементов. Изменения содержимого этого буфера будут видны в новом буфере, и наоборот; значения позиции, предела и отметки двух буферов будут независимы.
Позиция нового буфера будет равна нулю, его ёмкость и предел будут равны length, его отметка не будет определена, а порядок байтов будет BIG_ENDIAN. Новый буфер будет прямым тогда и только тогда, когда прямым является этот буфер, и будет доступен только для чтения тогда и только тогда, когда этот буфер доступен только для чтения.
Чтение байтов в физическую память при вызове load() для возвращённого буфера или запись байтов на устройство хранения при вызове force() для возвращённого буфера будут действовать только на поддиапазон этого буфера, представленный возвращённым буфером, а именно [index,index+length), где предполагается, что index и length удовлетворяют предварительным условиям.
- Определено в:
-
sliceв классеByteBuffer - Параметры:
-
index— позиция в этом буфере, с которой будет начинаться содержимое нового буфера; должна быть неотрицательной и не превышатьlimit() -
length— число элементов, которое будет содержать новый буфер; должно быть неотрицательным и не превышатьlimit() - index - Возвращает:
- Новый буфер
- Начиная с версии:
- 17
duplicate
public abstract MappedByteBuffer duplicate()
Содержимым нового буфера будет содержимое этого буфера. Изменения содержимого этого буфера будут видны в новом буфере, и наоборот; значения позиции, предела и отметки двух буферов будут независимы.
Значения ёмкости, предела, позиции и отметки нового буфера будут совпадать со значениями этого буфера, а его порядок байтов будет BIG_ENDIAN. Новый буфер будет прямым тогда и только тогда, когда прямым является этот буфер, и будет доступен только для чтения тогда и только тогда, когда этот буфер доступен только для чтения.
- Определено в:
-
duplicateв классеByteBuffer - Возвращает:
- Новый буфер байтов
- Начиная с версии:
- 17
compact
public abstract MappedByteBuffer compact()
Байты между текущей позицией и пределом буфера, если они есть, копируются в начало буфера. То есть байт с индексом p = position() копируется в индекс ноль, байт с индексом p + 1 копируется в индекс один и так далее, пока байт с индексом limit() - 1 не будет скопирован в индекс n = limit() - 1 - p. Затем позиция буфера устанавливается в n+1, а предел устанавливается равным ёмкости буфера. Если отметка установлена, она сбрасывается.
Позиция буфера устанавливается в число скопированных байтов, а не в ноль, поэтому сразу после вызова этого метода можно вызвать другой относительный метод put.
Вызовите этот метод после записи данных из буфера, если операция записи была выполнена не полностью. Например, следующий цикл копирует байты из одного канала в другой через буфер buf:
buf.clear(); // Prepare buffer for use
while (in.read(buf) >= 0 || buf.position != 0) {
buf.flip();
out.write(buf);
buf.compact(); // In case of partial write
}
- Определено в:
-
compactв классеByteBuffer - Возвращает:
- Этот буфер
- Выбрасывает:
-
ReadOnlyBufferException— если этот буфер доступен только для чтения - Начиная с версии:
- 17
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/nio/MappedByteBuffer.html