Spec-Zone.ru › OpenJDK 24

Класс Buffer

java.lang.Object
java.nio.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:
Sealed class hierarchy graph for BufferSealed class hierarchy graph for Buffer
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(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)
Создаёт новый буфер, содержимое которого является совместно используемой подпоследовательностью содержимого этого буфера.

Методы, унаследованные от класса java.lang.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

© 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/nio/Buffer.html

Spec-Zone.ru

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