Класс MappedByteBuffer
- Все реализованные интерфейсы:
Comparable<ByteBuffer>
public abstract 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в классеBuffer - Параметры:
-
newPosition- Новое значение позиции; должно быть неотрицательным и не больше текущего предела - Возвращает:
- Этот буфер
limit
public final MappedByteBuffer limit(int newLimit)
- Переопределяет:
-
limitв классеBuffer - Параметры:
-
newLimit- Новое значение предела; должно быть неотрицательным и не больше ёмкости этого буфера - Возвращает:
- Этот буфер
mark
public final MappedByteBuffer mark()
- Переопределяет:
-
markв классеBuffer - Возвращает:
- Этот буфер
reset
public final MappedByteBuffer reset()
Вызов этого метода не изменяет и не отбрасывает значение метки.
- Переопределяет:
-
resetв классеBuffer - Возвращает:
- Этот буфер
clear
public final MappedByteBuffer clear()
Вызывайте этот метод перед использованием последовательности операций чтения канала или операций put для заполнения этого буфера. Например:
buf.clear(); // Prepare buffer for reading in.read(buf); // Read data
Этот метод на самом деле не стирает данные в буфере, но он назван так, как будто это так, потому что чаще всего он используется в ситуациях, в которых это так и есть.
- Переопределяет:
-
clearв классеBuffer - Возвращает:
- Этот буфер
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в классеBuffer - Возвращает:
- Этот буфер
rewind
public final MappedByteBuffer rewind()
Вызывайте этот метод перед последовательностью операций записи канала или операций get, предполагая, что предел уже установлен должным образом. Например:
out.write(buf); // Write remaining data buf.rewind(); // Rewind buffer buf.get(array); // Copy data into array
- Переопределяет:
-
rewindв классеBuffer - Возвращает:
- Этот буфер
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, 2021, 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/17/docs/api/java.base/java/nio/MappedByteBuffer.html