Spec-Zone.ru › OpenJDK 17

Класс Buffer

java.lang.Object
java.nio.Buffer
Direct Known Subclasses:
ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer
public abstract class Buffer extends Object
Контейнер для данных определённого примитивного типа.

Буфер — это линейная, конечная последовательность элементов определённого примитивного типа. Помимо содержимого, важными свойствами буфера являются его ёмкость, предел и позиция:

Ёмкость буфера — это количество элементов, которые он содержит. Ёмкость буфера никогда не является отрицательной и никогда не изменяется.

Предел буфера — это индекс первого элемента, который не должен считываться или записываться. Предел буфера никогда не является отрицательным и никогда не превышает его ёмкость.

Позиция буфера — это индекс следующего элемента для чтения или записи. Позиция буфера никогда не является отрицательной и никогда не превышает его предел.

Для каждого примитивного типа, отличного от boolean, существует один подкласс этого класса.

Передача данных

Каждый подкласс этого класса определяет два типа операций get и put:

Относительные операции считывают или записывают один или несколько элементов, начиная с текущей позиции, а затем увеличивают позицию на количество переданных элементов. Если запрошенная передача превышает предел, то относительная операция get вызывает исключение BufferUnderflowException, а относительная операция put вызывает исключение BufferOverflowException; в любом случае данные не передаются.

Абсолютные операции принимают явный индекс элемента и не влияют на позицию. Абсолютные операции get и put вызывают исключение IndexOutOfBoundsException, если значение аргумента индекса превышает предел.

Конечно, данные также могут передаваться в буфер или из него с помощью операций ввода-вывода соответствующего канала, которые всегда относительны к текущей позиции.

Разметка и сброс

Разметка буфера — это индекс, к которому будет сброшена его позиция, когда вызывается метод reset. Разметка не всегда определена, но когда она определена, она никогда не является отрицательной и никогда не превышает позицию. Если разметка определена, она отбрасывается, когда позиция или предел изменяются на значение, меньшее разметки. Если разметка не определена, вызов метода reset приводит к исключению InvalidMarkException.

Инварианты

Для значений разметки, позиции, предела и ёмкости выполняется следующий инвариант:

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);
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

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

емкость

public final int capacity()
Возвращает емкость этого буфера.
Возвращает:
Емкость этого буфера

позиция

public final int position()
Возвращает текущую позицию этого буфера.
Возвращает:
Позицию этого буфера

позиция

public Buffer position(int newPosition)
Устанавливает позицию этого буфера. Если метка определена и больше новой позиции, то она отбрасывается.
Параметры:
newPosition - Новое значение позиции; должно быть неотрицательным и не превышать текущего предела
Возвращает:
Этот буфер
Исключения:
IllegalArgumentException - Если условия на newPosition не соблюдаются

предел

public final int limit()
Возвращает предел этого буфера.
Возвращает:
Предел этого буфера

предел

public Buffer limit(int newLimit)
Устанавливает предел этого буфера. Если позиция больше нового предела, то она устанавливается на новый предел. Если метка определена и больше нового предела, то она отбрасывается.
Параметры:
newLimit - Новое значение предела; должно быть неотрицательным и не превышать емкость этого буфера
Возвращает:
Этот буфер
Исключения:
IllegalArgumentException - Если условия на newLimit не соблюдаются

метка

public Buffer mark()
Устанавливает метку этого буфера в его текущей позиции.
Возвращает:
Этот буфер

сброс

public Buffer reset()
Сбрасывает позицию этого буфера до ранее помеченной позиции.

Вызов этого метода не изменяет и не отбрасывает значение метки.

Возвращает:
Этот буфер
Исключения:
InvalidMarkException - Если метка не была установлена

очистка

public Buffer clear()
Очищает этот буфер. Позиция устанавливается в ноль, предел устанавливается в емкость, и метка отбрасывается.

Вызовите этот метод перед использованием последовательности операций чтения канала или операций put для заполнения этого буфера. Например:

 buf.clear();     // Prepare buffer for reading
 in.read(buf);    // Read data

Этот метод фактически не стирает данные в буфере, но он назван так, как будто это делает, потому что он чаще всего используется в ситуациях, в которых это может быть так же.

Возвращает:
Этот буфер

переворот

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 при передаче данных из одного места в другое.

Возвращает:
Этот буфер

перемотка

public Buffer rewind()
Перематывает этот буфер. Позиция устанавливается в ноль, и метка отбрасывается.

Вызовите этот метод перед последовательностью операций записи в канал или операциями get, предполагая, что предел уже установлен должным образом. Например:

 out.write(buf);    // Write remaining data
 buf.rewind();      // Rewind buffer
 buf.get(array);    // Copy data into array
Возвращает:
Этот буфер

остаток

public final int remaining()
Возвращает количество элементов между текущей позицией и пределом.
Возвращает:
Количество элементов, оставшихся в этом буфере

естьОстаток

public final boolean hasRemaining()
Указывает, есть ли элементы между текущей позицией и пределом.
Возвращает:
true если и только если в этом буфере остается как минимум один элемент

только для чтения

public abstract boolean isReadOnly()
Указывает, является ли этот буфер только для чтения.
Возвращает:
true если и только если этот буфер только для чтения

имеетМассив

public abstract boolean hasArray()
Указывает, поддерживается ли этот буфер доступным массивом.

Если этот метод возвращает true, то методы array и arrayOffset могут безопасно вызываться.

Возвращает:
true если и только если этот буфер поддерживается массивом и не является только для чтения
С:
1.6

массив

public abstract Object array()
Возвращает массив, который поддерживает этот буфер (необязательная операция).

Этот метод предназначен для более эффективной передачи массивно-поддерживаемых буферов в нативный код. Конкретные подклассы предоставляют более строго типизированные значения возврата для этого метода.

Изменения в содержимом этого буфера приведут к изменению содержимого возвращаемого массива, и наоборот.

Вызовите метод hasArray перед вызовом этого метода, чтобы убедиться, что этот буфер имеет доступный поддерживающий массив.

Возвращает:
Массив, который поддерживает этот буфер
Исключения:
ReadOnlyBufferException - Если этот буфер поддерживается массивом, но является только для чтения
UnsupportedOperationException - Если этот буфер не поддерживается доступным массивом
С:
1.6

смещениеМассива

public abstract int arrayOffset()
Возвращает смещение в поддерживающем массиве этого буфера первого элемента буфера (необязательная операция).

Если этот буфер поддерживается массивом, то позиции буфера p соответствует индекс массива p + arrayOffset().

Вызовите метод hasArray перед вызовом этого метода, чтобы убедиться, что этот буфер имеет доступный поддерживающий массив.

Возвращает:
Смещение в массиве буфера первого элемента буфера
Исключения:
ReadOnlyBufferException - Если этот буфер поддерживается массивом, но является только для чтения
UnsupportedOperationException - Если этот буфер не поддерживается доступным массивом
С:
1.6

прямой

public abstract boolean isDirect()
Указывает, является ли этот буфер прямым.
Возвращает:
true если и только если этот буфер прямой
С:
1.6

срез

public abstract Buffer slice()
Создает новый буфер, чье содержимое является общим подпоследовательностью содержимого этого буфера.

Содержимое нового буфера начнется в текущей позиции этого буфера. Изменения в содержимом этого буфера будут видны в новом буфере, и наоборот; позиции, пределы и значения меток двух буферов будут независимыми.

Позиция нового буфера будет нулевой, его емкость и предел будут равны количеству оставшихся элементов в этом буфере, его метка будет неопределенной. Новый буфер будет прямым, если и только если этот буфер прямой, и он будет только для чтения, если и только если этот буфер только для чтения.

Возвращает:
Новый буфер
С:
9

срез

public abstract Buffer slice(int index, int length)
Создает новый буфер, чье содержимое является общим подпоследовательностью содержимого этого буфера.

Содержимое нового буфера начнется с позиции index в этом буфере и будет содержать length элементов. Изменения в содержимом этого буфера будут видны в новом буфере, и наоборот; позиции, пределы и значения меток двух буферов будут независимыми.

Позиция нового буфера будет нулевой, его емкость и предел будут length, его метка будет неопределенной. Новый буфер будет прямым, если и только если этот буфер прямой, и он будет только для чтения, если и только если этот буфер только для чтения.

Параметры:
index - Позиция в этом буфере, с которой начнется содержимое нового буфера; должна быть неотрицательной и не превышать limit()
length - Количество элементов, которые будет содержать новый буфер; должно быть неотрицательным и не превышать limit() - index
Возвращает:
Новый буфер
Исключения:
IndexOutOfBoundsException - Если index отрицательно или больше limit(), length отрицательно или length > limit() - index
С:
13

дубликат

public abstract Buffer duplicate()
Создает новый буфер, который разделяет содержимое этого буфера.

Содержимое нового буфера будет таким же, как у этого буфера. Изменения в содержимом этого буфера будут видны в новом буфере, и наоборот; позиции, пределы и значения меток двух буферов будут независимыми.

Емкость, предел, позиция и значения меток нового буфера будут идентичны значениям этого буфера. Новый буфер будет прямым, если и только если этот буфер прямой, и он будет только для чтения, если и только если этот буфер только для чтения.

Возвращает:
Новый буфер
С:
9

© 1993, 2021, 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/17/docs/api/java.base/java/nio/Buffer.html

Spec-Zone.ru

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