Spec-Zone.ru › OpenJDK 25

Класс Buffer

java.lang.Object
java.nio.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);
Граф запечатанной иерархии классов:
Sealed class hierarchy graph for BufferSealed class hierarchy graph for Buffer
Начиная с версии:
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(int newLimit)
Устанавливает предел этого буфера.
Buffer mark()
Устанавливает отметку этого буфера в его текущей позиции.
final int position()
Возвращает позицию этого буфера.
Buffer position(int newPosition)
Устанавливает позицию этого буфера.
final int remaining()
Возвращает количество элементов между текущей позицией и пределом.
Buffer reset()
Возвращает позицию этого буфера к ранее установленной отметке.
Buffer rewind()
Перематывает этот буфер.
abstract Buffer slice()
Создаёт новый буфер, содержимое которого является общей подпоследовательностью содержимого этого буфера.
abstract Buffer slice(int index, int length)
Создаёт новый буфер, содержимое которого является общей подпоследовательностью содержимого этого буфера.

Методы, объявленные в классе Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, 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

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в разделе Документация Java SE, содержащем более подробные описания для разработчиков, обзоры концепций, определения терминов, обходные решения и примеры работающего кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её аффилированных лиц в США и других странах.
Авторские права © 1993, 2025, Oracle и/или её аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API