Класс 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 |
Создает новый буфер байтов, содержимое которого является общей подпоследовательностью содержимого этого буфера. |
Методы, объявленные в классе java.nio.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
Методы, объявленные в классе java.nio.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 - Возвращает:
- Новый буфер байтов
- См. также:
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 - Возвращает:
- Новый буфер
duplicate
public abstract MappedByteBuffer duplicate()
Содержимое нового буфера будет таким же, как и у этого буфера. Изменения в содержимом этого буфера будут видны в новом буфере и наоборот; значения позиции, предела и метки двух буферов будут независимыми.
Значения емкости, предела, позиции и метки нового буфера будут идентичны значениям этого буфера, а порядок байтов будет BIG_ENDIAN. Новый буфер будет прямым тогда и только тогда, когда этот буфер является прямым, и он будет доступен только для чтения тогда и только тогда, когда этот буфер доступен только для чтения.
- Указано в:
-
duplicateв классеByteBuffer - Возвращает:
- Новый буфер байтов
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 - Возвращает:
- Этот буфер
© 1993, 2023, 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/21/docs/api/java.base/java/nio/MappedByteBuffer.html