Класс Buffer

Известные непосредственные подклассы:
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 <= mark <= position <= limit <= capacity

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

Дополнительные операции

Помимо методов доступа к значениям позиции, предела и ёмкости, а также для пометки и сброса, этот класс также определяет следующие операции над буферами:

  • clear() подготавливает буфер к новой последовательности операций чтения канала или относительных операций put: устанавливает предел равным ёмкости и позицию равной 0.

  • flip() подготавливает буфер к новой последовательности операций записи канала или относительных операций get: устанавливает предел равным текущей позиции, а затем позицию равной 0.

  • rewind() подготавливает буфер к повторному чтению уже содержащихся данных: предел остаётся неизменным, а позиция устанавливается в 0.

  • slice() создаёт подпоследовательность буфера: предел и позиция остаются неизменными.

  • duplicate() создаёт полную копию буфера: предел и позиция остаются неизменными.

Читаемые буферы

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

Безопасность потоков

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

Цепочки вызовов

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

b.flip();
b.position(23);
b.limit(42);
может быть заменена одним более компактным оператором
b.flip().position(23).limit(42);
С:
1.4

Методы

Модификатор и тип Метод Описание
abstract Object array()

Возвращает массив, на котором основан этот буфер (необязательная операция).

abstract int arrayOffset()

Возвращает смещение в массиве, на котором основан этот буфер, первого элемента буфера (необязательная операция).

int capacity()

Возвращает ёмкость этого буфера.

Buffer clear()

Очищает этот буфер.

abstract Buffer duplicate()

Создаёт новый буфер, который разделяет содержимое этого буфера.

Buffer flip()

Переворачивает этот буфер.

abstract boolean hasArray()

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

boolean hasRemaining()

Указывает, есть ли элементы между текущей позицией и пределом.

abstract boolean isDirect()

Указывает, является ли этот буфер прямым.

abstract boolean isReadOnly()

Указывает, является ли этот буфер только для чтения.

int limit()

Возвращает предел этого буфера.

Buffer limit​(int newLimit)

Устанавливает предел этого буфера.

Buffer mark()

Устанавливает метку этого буфера в его текущей позиции.

int position()

Возвращает позицию этого буфера.

Buffer position​(int newPosition)

Устанавливает позицию этого буфера.

int remaining()

Возвращает количество элементов между текущей позицией и пределом.

Buffer reset()

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

Buffer rewind()

Перематывает этот буфер.

abstract Buffer slice()

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

Методы, объявленные в классе 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

duplicate

public abstract Buffer duplicate()

Создаёт новый буфер, который разделяет содержимое этого буфера.

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

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

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

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

Spec-Zone .ru
спецификации, руководства, описания, API