Класс 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 байт. Если файл, сопоставленный с этим буфером, находится на локальном устройстве хранения, то по возвращении из этого метода гарантируется, что все изменения, внесенные в выбранную область буфера с момента его создания или последнего вызова этого метода, будут записаны на это устройство. Операция force может записывать байты, выходящие за пределы указанной области, например, для обеспечения передачи блоков данных с некоторым устройством гранулярности в полном объёме.
Если файл не находится на локальном устройстве, то такая гарантия не предоставляется.
Если этот буфер не был сопоставлен в режиме чтения/записи (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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/nio/MappedByteBuffer.html