Класс Buffer
- Direct Known Subclasses:
-
ByteBuffer,CharBuffer,DoubleBuffer,FloatBuffer,IntBuffer,LongBuffer,ShortBuffer
public abstract sealed class Buffer extends Object permits ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer
Буфер — это линейная, конечная последовательность элементов определённого примитивного типа. Помимо своего содержимого, важными свойствами буфера являются его емкость, предел и позиция:
Емкость буфера — это количество элементов, которые он содержит. Емкость буфера никогда не бывает отрицательной и никогда не меняется.
Предел буфера — это индекс первого элемента, который не должен читаться или записываться. Предел буфера никогда не бывает отрицательным и никогда не бывает больше его емкости.
Позиция буфера — это индекс следующего элемента для чтения или записи. Позиция буфера никогда не бывает отрицательной и никогда не бывает больше предела.
Для каждого примитивного типа (кроме boolean) существует один подкласс этого класса.
Передача данных
Каждый подкласс этого класса определяет два типа операций get и put:
Относительные операции читают или записывают один или несколько элементов, начиная с текущей позиции, а затем увеличивают позицию на количество переданных элементов. Если запрашиваемая передача превышает предел, то относительная операция get вызывает исключение
BufferUnderflowException, а относительная операция put вызывает исключениеBufferOverflowException; в любом случае данные не передаются.Абсолютные операции принимают явный индекс элемента и не влияют на позицию. Абсолютные операции get и put вызывают исключение
IndexOutOfBoundsException, если аргумент индекса превышает предел.
Данные также могут, конечно, передаваться в буфер или из него операциями ввода-вывода соответствующего канала, которые всегда относительны к текущей позиции.
Пометка и сброс
Пометка буфера — это индекс, к которому будет сброшена его позиция при вызове метода reset. Пометка не всегда определена, но когда она определена, она никогда не бывает отрицательной и никогда не бывает больше позиции. Если пометка определена, она отбрасывается, когда позиция или предел устанавливаются в значение, меньшее пометки. Если пометка не определена, вызов метода reset вызывает исключение InvalidMarkException.
Инварианты
Для значений пометки, позиции, предела и емкости выполняется следующий инвариант:
0<=пометка<=позиция<=предел<=емкость
Недавно созданный буфер всегда имеет позицию 0 и неопределённую пометку. Начальный предел может быть 0 или каким-то другим значением, которое зависит от типа буфера и способа его создания. Каждый элемент только что выделенного буфера инициализируется нулём.
Дополнительные операции
В дополнение к методам для доступа к значениям позиции, предела и емкости, а также для пометки и сброса, этот класс также определяет следующие операции над буферами:
clear()подготавливает буфер к новой последовательности операций чтения канала или относительных операций put: Он устанавливает предел в емкость, а позицию в ноль.flip()подготавливает буфер к новой последовательности операций записи канала или относительных операций get: Он устанавливает предел в текущую позицию, а затем позицию в ноль.rewind()подготавливает буфер к повторному чтению данных, которые он уже содержит: Он оставляет предел неизменным и устанавливает позицию в ноль.Методы
slice()иslice(index,length)создают подпоследовательность буфера: они оставляют предел и позицию неизменными.duplicate()создаёт поверхностную копию буфера: он оставляет предел и позицию неизменными.
Буферы только для чтения
Каждый буфер читается, но не каждый буфер записывается. Методы изменения каждого класса буфера определены как необязательные операции, которые будут вызывать исключение ReadOnlyBufferException при вызове для буфера только для чтения. Буфер только для чтения не позволяет изменять его содержимое, но значения пометки, позиции и предела изменяемы. Читается ли буфер только для чтения, можно определить, вызвав его метод isReadOnly.
Поток безопасности
Буферы не предназначены для одновременного использования несколькими потоками. Если буфер будет использоваться более чем одним потоком, доступ к буферу должен контролироваться соответствующей синхронизацией.
Цепочки вызовов
Методы в этом классе, которые не возвращают значение, возвращают буфер, на котором они вызываются. Это позволяет цеплять вызовы методов; например, последовательность операторов
b.flip();
b.position(23);
b.limit(42);
b.flip().position(23).limit(42);
- Sealed Class Hierarchy Graph:
- Since:
- 1.4
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
abstract Object |
array() |
Возвращает массив, поддерживающий этот буфер (необязательная операция). |
abstract int |
arrayOffset() |
Возвращает смещение в массиве, поддерживающем этот буфер, первого элемента буфера (необязательная операция). |
final int |
capacity() |
Возвращает емкость этого буфера. |
Buffer |
clear() |
Очищает этот буфер. |
abstract Buffer |
duplicate() |
Создаёт новый буфер, который разделяет содержимое этого буфера. |
Buffer |
flip() |
Переворачивает этот буфер. |
abstract boolean |
hasArray() |
Указывает, поддерживается ли этот буфер доступным массивом. |
final boolean |
hasRemaining() |
Указывает, есть ли какие-либо элементы между текущей позицией и пределом. |
abstract boolean |
isDirect() |
Указывает, является ли этот буфер прямым. |
abstract boolean |
isReadOnly() |
Указывает, является ли этот буфер только для чтения. |
final int |
limit() |
Возвращает предел этого буфера. |
Buffer |
limit |
Устанавливает предел этого буфера. |
Buffer |
mark() |
Устанавливает метку этого буфера в его позиции. |
final int |
position() |
Возвращает позицию этого буфера. |
Buffer |
position |
Устанавливает позицию этого буфера. |
final int |
remaining() |
Возвращает количество элементов между текущей позицией и пределом. |
Buffer |
reset() |
Сбрасывает позицию этого буфера до ранее помеченной позиции. |
Buffer |
rewind() |
Перематывает этот буфер. |
abstract Buffer |
slice() |
Создает новый буфер, содержимое которого является совмещенной подпоследовательностью содержимого этого буфера. |
abstract Buffer |
slice |
Создает новый буфер, содержимое которого является совмещенной подпоследовательностью содержимого этого буфера. |
Подробное описание методов
capacity
public final int capacity()
- Возвращает:
- Емкость этого буфера
position
public final int position()
- Возвращает:
- Позиция этого буфера
position
public Buffer position(int newPosition)
- Параметры:
-
newPosition- Новое значение позиции; должно быть неотрицательным и не превышать текущего предела - Возвращает:
- Этот буфер
- Исключения:
-
IllegalArgumentException- Если условия наnewPositionне выполняются
limit
public final int limit()
- Возвращает:
- Предел этого буфера
limit
public Buffer limit(int newLimit)
- Параметры:
-
newLimit- Новое значение предела; должно быть неотрицательным и не превышать емкость этого буфера - Возвращает:
- Этот буфер
- Исключения:
-
IllegalArgumentException- Если условия наnewLimitне выполняются
mark
public Buffer mark()
- Возвращает:
- Этот буфер
reset
public Buffer reset()
Вызов этого метода не изменяет и не отбрасывает значение метки.
- Возвращает:
- Этот буфер
- Исключения:
-
InvalidMarkException- Если метка не установлена
clear
public Buffer clear()
Вызовите этот метод перед использованием последовательности операций чтения канала или операций put для заполнения этого буфера. Например:
buf.clear(); // Prepare buffer for reading
in.read(buf); // Read data
Этот метод фактически не стирает данные в буфере, но он назван так, как будто он это делает, потому что его чаще всего используют в ситуациях, когда это может быть так же эффективно.
- Возвращает:
- Этот буфер
flip
public Buffer 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 при передаче данных из одного места в другое.
- Возвращает:
- Этот буфер
rewind
public Buffer rewind()
Вызовите этот метод перед последовательностью операций записи канала или операций get, предполагая, что предел уже установлен должным образом. Например:
out.write(buf); // Write remaining data
buf.rewind(); // Rewind buffer
buf.get(array); // Copy data into array
- Возвращает:
- Этот буфер
remaining
public final int remaining()
- Возвращает:
- Количество элементов, оставшихся в этом буфере
hasRemaining
public final boolean hasRemaining()
- Возвращает:
-
trueесли и только если в этом буфере осталось как минимум один элемент
isReadOnly
public abstract boolean isReadOnly()
- Возвращает:
-
trueесли и только если этот буфер только для чтения
hasArray
public abstract boolean hasArray()
Если этот метод возвращает true то методы array и arrayOffset могут быть безопасно вызваны.
- Возвращает:
-
trueесли и только если этот буфер поддерживается массивом и не является только для чтения - С:
- 1.6
array
public abstract Object array()
Этот метод предназначен для того, чтобы более эффективно передавать массивоориентированные буферы в нативный код. Конкретные подклассы предоставляют более типизированные значения возврата для этого метода.
Изменения в содержимом этого буфера приведут к изменению содержимого возвращаемого массива, и наоборот.
Вызовите метод hasArray перед вызовом этого метода, чтобы убедиться, что этот буфер имеет доступный поддерживающий массив.
- Возвращает:
- Массив, который поддерживает этот буфер
- Исключения:
-
ReadOnlyBufferException- Если этот буфер поддерживается массивом, но является только для чтения -
UnsupportedOperationException- Если этот буфер не поддерживается доступным массивом - С:
- 1.6
arrayOffset
public abstract int arrayOffset()
Если этот буфер поддерживается массивом, то позиция буфера p соответствует индексу массива p + arrayOffset().
Вызовите метод hasArray перед вызовом этого метода, чтобы убедиться, что этот буфер имеет доступный поддерживающий массив.
- Возвращает:
- Смещение в массиве этого буфера первого элемента буфера
- Исключения:
-
ReadOnlyBufferException- Если этот буфер поддерживается массивом, но является только для чтения -
UnsupportedOperationException- Если этот буфер не поддерживается доступным массивом - С:
- 1.6
isDirect
public abstract boolean isDirect()
- Возвращает:
-
trueесли и только если этот буфер прямой - С:
- 1.6
slice
public abstract Buffer slice()
Содержимое нового буфера начнется с текущей позиции этого буфера. Изменения в содержимом этого буфера будут видны в новом буфере, и наоборот; значения позиции, предела и метки двух буферов будут независимыми.
Позиция нового буфера будет равна нулю, его емкость и предел будут равны количеству оставшихся элементов в этом буфере, метка будет неопределенной. Новый буфер будет прямым, если и только если этот буфер прямой, и он будет только для чтения, если и только если этот буфер только для чтения.
- Возвращает:
- Новый буфер
- С:
- 9
slice
public abstract Buffer slice(int index, int length)
Содержимое нового буфера начнется с позиции index в этом буфере и будет содержать length элементов. Изменения в содержимом этого буфера будут видны в новом буфере, и наоборот; значения позиции, предела и метки двух буферов будут независимыми.
Позиция нового буфера будет равна нулю, его емкость и предел будут равны length, метка будет неопределенной. Новый буфер будет прямым, если и только если этот буфер прямой, и он будет только для чтения, если и только если этот буфер только для чтения.
- Параметры:
-
index- Позиция в этом буфере, с которой начнется содержимое нового буфера; должна быть неотрицательной и не большеlimit() -
length- Количество элементов, которые будет содержать новый буфер; должно быть неотрицательным и не большеlimit() - index - Возвращает:
- Новый буфер
- Исключения:
-
IndexOutOfBoundsException- Еслиindexотрицательно или большеlimit(),lengthотрицательно илиlength > limit() - index - С:
- 13
duplicate
public abstract Buffer duplicate()
Содержимое нового буфера будет таким же, как у этого буфера. Изменения в содержимом этого буфера будут видны в новом буфере, и наоборот; значения позиции, предела и метки двух буферов будут независимыми.
Емкость, предел, позиция и метка нового буфера будут идентичны значениям этого буфера. Новый буфер будет прямым, если и только если этот буфер прямой, и он будет только для чтения, если и только если этот буфер только для чтения.
- Возвращает:
- Новый буфер
- С:
- 9
© 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/Buffer.html