Класс 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: устанавливает предел равным ёмкости и позицию равной 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