Spec-Zone.ru › OpenJDK 27

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

Подробное описание методов

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, 2026, 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.

Spec-Zone.ru

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