Класс Buffer
- java.lang.Object
-
- java.nio.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: он устанавливает предел на емкость и положение на ноль.flip()делает буфер готовым к новой последовательности операций записи канала или относительных операций get: он устанавливает предел на текущее положение, а затем устанавливает положение на ноль.rewind()делает буфер готовым к повторному считыванию уже содержащихся данных: он оставляет предел неизменным и устанавливает положение на ноль.
Буферы только для чтения
Каждый буфер читаем, но не каждый буфер записывается. Методы изменения каждого класса буфера определены как необязательные операции, которые будут выбрасывать исключение 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() Очищает этот буфер. |
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() Сбрасывает этот буфер. |
Методы, унаследованные от класса 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 final Buffer position(int newPosition)
Устанавливает позицию этого буфера. Если метка определена и больше новой позиции, она отбрасывается.
- Параметры:
-
newPosition- Новое значение позиции; должно быть неотрицательным и не больше текущего предела - Возвращает:
- Этот буфер
- Выбрасывает:
-
IllegalArgumentException- Если условия наnewPositionне выполнены
limit
public final int limit()
Возвращает предел этого буфера.
- Возвращает:
- Предел этого буфера
limit
public final Buffer limit(int newLimit)
Устанавливает предел этого буфера. Если позиция больше нового предела, она устанавливается равной новому пределу. Если метка определена и больше нового предела, она отбрасывается.
- Параметры:
-
newLimit- Новое значение предела; должно быть неотрицательным и не больше емкости этого буфера - Возвращает:
- Этот буфер
- Выбрасывает:
-
IllegalArgumentException- Если условия наnewLimitне выполнены
mark
public final Buffer mark()
Устанавливает метку этого буфера в его текущей позиции.
- Возвращает:
- Этот буфер
reset
public final Buffer reset()
Возвращает позицию этого буфера к ранее установленной метке.
Вызов этого метода не изменяет и не отбрасывает значение метки.
- Возвращает:
- Этот буфер
- Выбрасывает:
-
InvalidMarkException- Если метка не была установлена
clear
public final Buffer clear()
Очищает этот буфер. Позиция устанавливается в ноль, предел - в емкость, а метка отбрасывается.
Вызывайте этот метод перед использованием последовательности операций чтения канала или операций put для заполнения этого буфера. Например:
buf.clear(); // Prepare buffer for reading in.read(buf); // Read data
Этот метод фактически не стирает данные в буфере, но он назван так, как будто он это делает, потому что чаще всего используется в ситуациях, в которых это и так происходит.
- Возвращает:
- Этот буфер
flip
public final 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 final 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
© 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.