Класс 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 |
Создаёт новый буфер, содержимое которого является общей подпоследовательностью содержимого этого буфера. |
Подробное описание методов
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.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/nio/Buffer.html