Класс Buffer
- Прямые известные подклассы:
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<=mark<=position<=limit<=capacity
Позиция вновь созданного буфера всегда равна нулю, а отметка не определена. Начальный предел может быть равен нулю или иметь другое значение, зависящее от типа буфера и способа его создания. Каждый элемент вновь выделенного буфера инициализируется нулем.
Дополнительные операции
Помимо методов для доступа к значениям позиции, предела и емкости, а также для установки отметки и сброса, этот класс определяет следующие операции над буферами:
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);
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
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 |
Создает новый буфер, содержимое которого представляет собой общую подпоследовательность содержимого этого буфера. |
Методы, объявленные в классе Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создает и возвращает копию этого объекта. |
boolean |
equals |
Показывает, равен ли другой объект этому объекту. |
protected void |
finalize() |
Устарело, будет удалено: этот элемент API может быть удален в будущей версии. Финализация объявлена устаревшей и будет удалена в одном из будущих выпусков. |
final Class |
getClass() |
Возвращает класс времени выполнения этого Object. |
int |
hashCode() |
Возвращает значение хеш-кода этого объекта. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
String |
toString() |
Возвращает строковое представление объекта. |
final void |
wait() |
Заставляет текущий поток ожидать пробуждения, обычно посредством уведомления или прерывания. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно посредством уведомления или прерывания, либо до истечения определенного времени. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно посредством уведомления или прерывания, либо до истечения определенного времени. |
Подробное описание методов
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, 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.