Класс ByteBuffer
- java.lang.Object
-
- java.nio.Buffer
-
- java.nio.ByteBuffer
- Все реализованные интерфейсы:
Comparable<ByteBuffer>
- Прямые известные подклассы:
MappedByteBuffer
public abstract class ByteBuffer extends Buffer implements Comparable<ByteBuffer>
Буфер байтов.
Этот класс определяет шесть категорий операций над буферами байтов:
Абсолютные и относительные методы
getиput, которые читают и записывают отдельные байты;Относительные методы
bulk get, которые передают непрерывные последовательности байтов из этого буфера в массив;Относительные методы
bulk put, которые передают непрерывные последовательности байтов из массива байтов или другого буфера байтов в этот буфер;Абсолютные и относительные методы
getиput, которые читают и записывают значения других примитивных типов, преобразуя их в последовательности байтов и обратно в соответствии с определенным порядком байтов;Методы для создания буферов-представлений, которые позволяют рассматривать буфер байтов как буфер, содержащий значения другого примитивного типа; и
Метод для
compactingбуфера байтов.
Буферы байтов могут быть созданы либо с помощью allocation, который выделяет память для содержимого буфера, либо с помощью wrapping существующего массива байтов в буфер.
Прямые против непрямых буферов
Буфер байтов может быть прямым или непрямым. В случае прямого буфера байтов виртуальная машина Java приложит все усилия, чтобы выполнить операции ввода-вывода нативного уровня непосредственно над ним. То есть, она попытается избежать копирования содержимого буфера в (или из) промежуточного буфера до (или после) каждого вызова одной из нативных операций ввода-вывода операционной системы.
Прямой буфер байтов может быть создан, вызвав фабричный метод allocateDirect этого класса. Буферы, возвращаемые этим методом, обычно имеют несколько более высокие затраты на выделение и освобождение памяти, чем непрямые буферы. Содержимое прямых буферов может находиться вне обычной кучи сборки мусора, поэтому их влияние на отслеживаемый объем памяти приложения может быть не очевидным. Поэтому рекомендуется выделять прямые буферы в основном для больших, долгоживущих буферов, которые подвергаются операциям ввода-вывода нативного уровня.
Прямой буфер байтов также может быть создан с помощью mapping области файла непосредственно в памяти. Реализация платформы Java может дополнительно поддерживать создание прямых буферов байтов из кода нативном языке через JNI. Если экземпляр одного из этих типов буферов ссылается на недоступную область памяти, то попытка доступа к этой области не изменит содержимое буфера и вызовет исключение с неопределенным сообщением либо в момент доступа, либо в какой-то момент позже.
Можно определить, является ли буфер байтов прямым или непрямым, вызвав его метод isDirect. Этот метод предоставляется для явного управления буферами в критически важных для производительности фрагментах кода.
Доступ к двоичным данным
Этот класс определяет методы для чтения и записи значений всех остальных примитивных типов, за исключением boolean. Примитивные значения преобразуются в (или из) последовательностей байтов в соответствии с текущим порядком байтов буфера, который можно получить и изменить с помощью методов order. Конкретные порядки байтов представлены экземплярами класса ByteOrder. Начальный порядок буфера байтов всегда BIG_ENDIAN.
Для доступа к неоднородным двоичным данным, то есть последовательностям значений разных типов, этот класс определяет семейство абсолютных и относительных методов get и put для каждого типа. Например, для 32-битовых значений с плавающей точкой этот класс определяет:
float getFloat() float getFloat(int index) void putFloat(float f) void putFloat(int index, float f)
Соответствующие методы определены для типов char,
short, int, long, и double. Параметры индекса абсолютных методов get и put указаны в байтах, а не в размерах считываемого или записываемого типа.
Для доступа к однородным двоичным данным, то есть последовательностям значений одного типа, этот класс определяет методы, которые могут создать представления заданного буфера байтов. Буфер представления — это просто другой буфер, чьё содержимое поддерживается буфером байтов. Изменения в содержимом буфера байтов будут видны в буфере представления, и наоборот; позиции, лимиты и метки обоих буферов независимы. Метод asFloatBuffer, например, создает экземпляр класса FloatBuffer, который поддерживается буфером байтов, над которым вызывается метод. Соответствующие методы создания представлений определены для типов char, short, int, long, и double.
Буферы-представления имеют три важных преимущества по сравнению с семействами методов get и put, специфичными для типов, описанных выше:
Буфер-представление индексируется не в терминах байтов, а в терминах размера значений, специфичных для типа;
Буфер-представление предоставляет относительные методы массового чтения get и записи put, которые могут передавать непрерывные последовательности значений между буфером и массивом или другим буфером того же типа; и
Буфер-представление потенциально намного эффективнее, так как он будет прямым, если и только если его подлежащий буфер байтов является прямым.
Порядок байтов буфера-представления фиксируется в соответствии с порядком байтов его буфера байтов в момент создания представления.
Цепочки вызовов
Методы в этом классе, которые не возвращают никакого значения, определены таким образом, что они возвращают буфер, над которым они вызваны. Это позволяет создавать цепочки вызовов методов. Последовательность операторов
bb.putInt(0xCAFEBABE); bb.putShort(3); bb.putShort(45);может, например, быть заменена одним оператором
bb.putInt(0xCAFEBABE).putShort(3).putShort(45);
- С момента:
- 1.4
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
ByteBuffer | alignedSlice(int unitSize) | Создает новый буфер байтов, чье содержимое является совмещенной и выровненной подпоследовательностью содержимого этого буфера. |
int | alignmentOffset(int index,
int unitSize) | Возвращает адрес памяти, указывающий на байт в заданном индексе, по модулю заданного размера единицы. |
static ByteBuffer | allocate(int capacity) | Выделяет новый буфер байтов. |
static ByteBuffer | allocateDirect(int capacity) | Выделяет новый прямой буфер байтов. |
byte[] | array() | Возвращает массив байтов, на котором основан этот буфер (необязательная операция). |
int | arrayOffset() | Возвращает смещение в массиве, поддерживающем этот буфер, первого элемента буфера (необязательная операция). |
abstract CharBuffer | asCharBuffer() | Создает представление этого буфера байтов как буфера символов. |
abstract DoubleBuffer | asDoubleBuffer() | Создает представление этого буфера байтов как буфера с двойной точностью. |
abstract FloatBuffer | asFloatBuffer() | Создает представление этого буфера байтов как буфера с плавающей точкой одинарной точности. |
abstract IntBuffer | asIntBuffer() | Создает представление этого буфера байтов как буфера целых чисел. |
abstract LongBuffer | asLongBuffer() | Создает представление этого буфера байтов как буфера длинных целых чисел. |
abstract ByteBuffer | asReadOnlyBuffer() | Создает новый, только для чтения, буфер байтов, который разделяет содержимое этого буфера. |
abstract ShortBuffer | asShortBuffer() | Создает представление этого буфера байтов как буфера коротких целых чисел. |
abstract ByteBuffer | compact() | Уплотняет этот буфер (необязательная операция). |
int | compareTo(ByteBuffer that) | Сравнивает этот буфер с другим. |
abstract ByteBuffer | duplicate() | Создает новый буфер байтов, который разделяет содержимое этого буфера. |
boolean | equals(Object ob) | Указывает, равен ли этот буфер другому объекту. |
abstract byte | get() | Относительный метод get. |
ByteBuffer | get(byte[] dst) | Относительный метод объемного get. |
ByteBuffer | get(byte[] dst,
int offset,
int length) | Относительный метод объемного get. |
abstract byte | get(int index) | Абсолютный метод get. |
abstract char | getChar() | Относительный метод get для чтения значения char. |
abstract char | getChar(int index) | Абсолютный метод get для чтения значения char. |
abstract double | getDouble() | Относительный метод get для чтения значения double. |
abstract double | getDouble(int index) | Абсолютный метод get для чтения значения double. |
abstract float | getFloat() | Относительный метод get для чтения значения float. |
abstract float | getFloat(int index) | Абсолютный метод get для чтения значения float. |
abstract int | getInt() | Относительный метод get для чтения значения int. |
abstract int | getInt(int index) | Абсолютный метод get для чтения значения int. |
abstract long | getLong() | Относительный метод get для чтения значения long. |
abstract long | getLong(int index) | Абсолютный метод get для чтения значения long. |
abstract short | getShort() | Относительный метод get для чтения значения short. |
abstract short | getShort(int index) | Абсолютный метод get для чтения значения short. |
boolean | hasArray() | Указывает, поддерживается ли этот буфер доступным массивом байтов. |
int | hashCode() | Возвращает текущий хэш-код этого буфера. |
abstract boolean | isDirect() | Указывает, является ли этот буфер байтов прямым. |
int | mismatch(ByteBuffer that) | Находит и возвращает относительный индекс первого несовпадения между этим буфером и заданным буфером. |
ByteOrder | order() | Получает порядок байтов этого буфера. |
ByteBuffer | order(ByteOrder bo) | Изменяет порядок байтов этого буфера. |
abstract ByteBuffer | put(byte b) | Относительный метод put (необязательная операция). |
ByteBuffer | put(byte[] src) | Относительный метод объемного put (необязательная операция). |
ByteBuffer | put(byte[] src,
int offset,
int length) | Относительный метод объемного put (необязательная операция). |
abstract ByteBuffer | put(int index,
byte b) | Абсолютный метод put (необязательная операция). |
ByteBuffer | put(ByteBuffer src) | Относительный метод объемного put (необязательная операция). |
abstract ByteBuffer | putChar(char value) | Относительный метод put для записи значения char (необязательная операция). |
abstract ByteBuffer | putChar(int index,
char value) | Абсолютный метод put для записи значения char (необязательная операция). |
abstract ByteBuffer | putDouble(double value) | Относительный метод put для записи значения double (необязательная операция). |
abstract ByteBuffer | putDouble(int index,
double value) | Абсолютный метод put для записи значения double (необязательная операция). |
abstract ByteBuffer | putFloat(float value) | Относительный метод put для записи значения float (необязательная операция). |
abstract ByteBuffer | putFloat(int index,
float value) | Абсолютный метод put для записи значения float (необязательная операция). |
abstract ByteBuffer | putInt(int value) | Относительный метод put для записи значения int (необязательная операция). |
abstract ByteBuffer | putInt(int index,
int value) | Абсолютный метод put для записи значения int (необязательная операция). |
abstract ByteBuffer | putLong(int index,
long value) | Абсолютный метод put для записи значения long (необязательная операция). |
abstract ByteBuffer | putLong(long value) | Относительный метод put для записи значения long (необязательная операция). |
abstract ByteBuffer | putShort(int index,
short value) | Абсолютный метод put для записи значения short (необязательная операция). |
abstract ByteBuffer | putShort(short value) | Относительный метод put для записи значения short (необязательная операция). |
abstract ByteBuffer | slice() | Создает новый буфер байтов, чье содержимое является совмещенной подпоследовательностью содержимого этого буфера. |
String | toString() | Возвращает строку, обобщающую состояние этого буфера. |
static ByteBuffer | wrap(byte[] array) | Оборачивает массив байтов в буфер. |
static ByteBuffer | wrap(byte[] array,
int offset,
int length) | Оборачивает массив байтов в буфер. |
Методы, объявленные в классе java.nio.Buffer
capacity, clear, flip, hasRemaining, isReadOnly, limit, limit, mark, position, position, remaining, reset, rewind Методы, объявленные в классе java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait Методы
allocateDirect
public static ByteBuffer allocateDirect(int capacity)
Выделяет новый прямой байтовый буфер.
Позиция нового буфера будет равна нулю, его предел будет равен его емкости, отметка будет неопределенной, каждый его элемент будет инициализирован нулём, а порядок байтов будет BIG_ENDIAN. Наличие массива backing array не определено.
- Параметры:
-
capacity- ёмкость нового буфера в байтах - Возвращает:
- Новый байтовый буфер
- Изначает:
-
IllegalArgumentException- Еслиcapacityявляется отрицательным целым числом
allocate
public static ByteBuffer allocate(int capacity)
Выделяет новый байтовый буфер.
Позиция нового буфера будет равна нулю, его предел будет равен его емкости, отметка будет неопределенной, каждый его элемент будет инициализирован нулём, а порядок байтов будет BIG_ENDIAN. Он будет иметь массив backing array, а его смещение массива array offset будет равно нулю.
- Параметры:
-
capacity- ёмкость нового буфера в байтах - Возвращает:
- Новый байтовый буфер
- Изначает:
-
IllegalArgumentException- Еслиcapacityявляется отрицательным целым числом
wrap
public static ByteBuffer wrap(byte[] array,
int offset,
int length) Оборачивает массив байтов в буфер.
Новый буфер будет поддерживаться заданным массивом байтов; то есть изменения в буфере приведут к изменению массива и наоборот. Ёмкость нового буфера будет array.length, его позиция будет offset, его предел будет offset + length, его отметка будет неопределённой, а порядок байтов будет BIG_ENDIAN. Его backing array будет заданным массивом, а смещение array offset будет равно нулю.
- Параметры:
-
array- массив, который будет поддерживать новый буфер -
offset- смещение подмассива для использования; должно быть неотрицательным и не большеarray.length. Позиция нового буфера будет установлена в это значение. -
length- длина подмассива для использования; должна быть неотрицательной и не большеarray.length - offset. Предел нового буфера будет установлен вoffset + length. - Возвращает:
- Новый байтовый буфер
- Изначает:
-
IndexOutOfBoundsException- Если условия наoffsetиlengthпараметры не соблюдаются
wrap
public static ByteBuffer wrap(byte[] array)
Оборачивает массив байтов в буфер.
Новый буфер будет поддерживаться заданным массивом байтов; то есть изменения в буфере приведут к изменению массива и наоборот. Емкость и предел нового буфера будут array.length, его позиция будет нулевой, его отметка будет неопределённой, а порядок байтов будет BIG_ENDIAN. Его backing array будет заданным массивом, а смещение array offset будет равно нулю.
- Параметры:
-
array- массив, который будет поддерживать этот буфер - Возвращает:
- Новый байтовый буфер
slice
public abstract ByteBuffer slice()
Создаёт новый байтовый буфер, содержимое которого является общим подпоследовательностью содержимого этого буфера.
Содержимое нового буфера начнется с текущей позиции этого буфера. Изменения в содержимом этого буфера будут видны в новом буфере, и наоборот; значения позиции, предела и отметки двух буферов будут независимы.
Позиция нового буфера будет равна нулю, его емкость и его предел будут равны количеству оставшихся байтов в этом буфере, его отметка будет неопределенной, а порядок байтов будет BIG_ENDIAN. Новый буфер будет прямым тогда и только тогда, когда этот буфер является прямым, и он будет только для чтения, если и только если этот буфер только для чтения.
- Определено в:
-
sliceв классеBuffer - Возвращает:
- Новый байтовый буфер
- См. также:
alignedSlice(int)
duplicate
public abstract ByteBuffer duplicate()
Создаёт новый байтовый буфер, который разделяет содержимое этого буфера.
Содержимое нового буфера будет таким же, как у этого буфера. Изменения в содержимом этого буфера будут видны в новом буфере, и наоборот; значения позиции, предела и отметки двух буферов будут независимы.
Значения ёмкости, предела, позиции и отметки нового буфера будут идентичны значениям этого буфера, а порядок байтов будет BIG_ENDIAN. Новый буфер будет прямым тогда и только тогда, когда этот буфер является прямым, и он будет только для чтения, если и только если этот буфер только для чтения.
asReadOnlyBuffer
public abstract ByteBuffer asReadOnlyBuffer()
Создаёт новый, только для чтения, байтовый буфер, который разделяет содержимое этого буфера.
Содержимое нового буфера будет таким же, как у этого буфера. Изменения в содержимом этого буфера будут видны в новом буфере; однако сам новый буфер будет только для чтения и не позволит изменять общее содержимое. Значения позиции, предела и отметки двух буферов будут независимы.
Ёмкость, предел, позиция и отметка нового буфера будут идентичны значениям этого буфера, а порядок байтов будет BIG_ENDIAN.
Если этот буфер сам по себе только для чтения, то этот метод ведет себя точно так же, как метод duplicate.
- Возвращает:
- Новый байтовый буфер только для чтения
get
public abstract byte get()
Относительный метод get. Считывает байт в текущей позиции буфера, а затем увеличивает позицию.
- Возвращает:
- Байт в текущей позиции буфера
- Изначает:
-
BufferUnderflowException- Если текущая позиция буфера не меньше его предела
put
public abstract ByteBuffer put(byte b)
Относительный метод put (необязательная операция).
Записывает заданный байт в этот буфер в текущей позиции, а затем увеличивает позицию.
- Параметры:
-
b- байт для записи - Возвращает:
- Этот буфер
- Изначает:
-
BufferOverflowException- Если текущая позиция этого буфера не меньше его предела -
ReadOnlyBufferException- Если этот буфер только для чтения
get
public abstract byte get(int index)
Абсолютный метод get. Считывает байт в заданном индексе.
- Параметры:
-
index- Индекс, из которого будет считан байт - Возвращает:
- Байт в заданном индексе
- Изначает:
-
IndexOutOfBoundsException- Еслиindexотрицателен или не меньше предела буфера
put
public abstract ByteBuffer put(int index,
byte b) Абсолютный метод put (необязательная операция).
Записывает заданный байт в этот буфер по заданному индексу.
- Параметры:
-
index- Индекс, в котором будет записан байт -
b- Значение байта для записи - Возвращает:
- Этот буфер
- Изначает:
-
IndexOutOfBoundsException- Еслиindexотрицателен или не меньше предела буфера -
ReadOnlyBufferException- Если этот буфер только для чтения
get
public ByteBuffer get(byte[] dst,
int offset,
int length) Относительный метод get для обработки блоков.
Этот метод копирует байты из этого буфера в заданный целевой массив. Если оставшихся байтов в буфере меньше, чем требуется для выполнения запроса, то есть, если length > remaining(), то байты не копируются и выбрасывается исключение BufferUnderflowException.
В противном случае этот метод копирует length байтов из этого буфера в заданный массив, начиная с текущей позиции этого буфера и в заданном смещении в массиве. Позиция этого буфера увеличивается на length.
Другими словами, вызов этого метода в виде src.get(dst, off, len) имеет точно такой же эффект, как цикл
for (int i = off; i < off + len; i++)
dst[i] = src.get(); за исключением того, что он сначала проверяет, достаточно ли байтов в этом буфере, и потенциально намного эффективнее.- Параметры:
-
dst- массив, в который будут записаны байты -
offset- смещение в массиве первого байта для записи; должно быть неотрицательным и не большеdst.length -
length- максимальное количество байтов для записи в заданный массив; должно быть неотрицательным и не большеdst.length - offset - Возвращает:
- Этот буфер
- Изначает:
-
BufferUnderflowException- Если оставшихся байтов в этом буфере меньше, чемlengthбайтов -
IndexOutOfBoundsException- Если условия наoffsetиlengthпараметры не соблюдаются
get
public ByteBuffer get(byte[] dst)
Относительный метод get для обработки блоков.
Этот метод копирует байты из этого буфера в заданный целевой массив. Вызов этого метода в форме src.get(a) ведет себя точно так же, как вызов
src.get(a, 0, a.length)
- Параметры:
-
dst- целевой массив - Возвращает:
- Этот буфер
- Изначает:
-
BufferUnderflowException- Если оставшихся байтов в этом буфере меньше, чемlengthбайтов
put
public ByteBuffer put(ByteBuffer src)
Метод put с относительным объемом копирования (необязательная операция).
Этот метод копирует оставшиеся байты из заданного исходного буфера в этот буфер. Если оставшихся байтов в исходном буфере больше, чем в этом буфере, то есть, если src.remaining() > remaining(), то байты не копируются, и выбрасывается исключение BufferOverflowException.
В противном случае, этот метод копирует n = src.remaining() байт из заданного буфера в этот буфер, начиная с текущих позиций каждого буфера. Затем позиции обоих буферов увеличиваются на n.
Другими словами, вызов этого метода в форме dst.put(src) имеет точно такой же эффект, как цикл
while (src.hasRemaining())
dst.put(src.get()); за исключением того, что он сначала проверяет, достаточно ли места в этом буфере, и потенциально намного эффективнее.- Параметры:
-
src- Исходный буфер, из которого считываются байты; не должен быть этим буфером - Возвращает:
- Этот буфер
- Выбрасывает:
-
BufferOverflowException- Если в этом буфере недостаточно места для оставшихся байтов в исходном буфере -
IllegalArgumentException- Если исходный буфер является этим буфером -
ReadOnlyBufferException- Если этот буфер только для чтения
put
public ByteBuffer put(byte[] src,
int offset,
int length) Метод put с относительным объемом копирования (необязательная операция).
Этот метод копирует байты из заданного исходного массива в этот буфер. Если байтов для копирования из массива больше, чем места осталось в этом буфере, то есть, если length > remaining(), то байты не копируются, и выбрасывается исключение BufferOverflowException.
В противном случае, этот метод копирует length байт из заданного массива в этот буфер, начиная с указанного смещения в массиве и текущей позиции этого буфера. Позиция этого буфера затем увеличивается на length.
Другими словами, вызов этого метода в форме dst.put(src, off, len) имеет точно такой же эффект, как цикл
for (int i = off; i < off + len; i++)
dst.put(a[i]); за исключением того, что он сначала проверяет, достаточно ли места в этом буфере, и потенциально намного эффективнее.- Параметры:
-
src- Массив, из которого считываются байты -
offset- Смещение в массиве первого байта для чтения; должно быть неотрицательным и не больше, чемarray.length -
length- Количество байтов для чтения из заданного массива; должно быть неотрицательным и не больше, чемarray.length - offset - Возвращает:
- Этот буфер
- Выбрасывает:
-
BufferOverflowException- Если в этом буфере недостаточно места -
IndexOutOfBoundsException- Если условия для параметровoffsetиlengthне соблюдены -
ReadOnlyBufferException- Если этот буфер только для чтения
put
public final ByteBuffer put(byte[] src)
Метод put с относительным объемом копирования (необязательная операция).
Этот метод копирует все содержимое заданного исходного массива байт в этот буфер. Вызов этого метода в форме dst.put(a) ведет себя точно так же, как вызов
dst.put(a, 0, a.length)
- Параметры:
-
src- Исходный массив - Возвращает:
- Этот буфер
- Выбрасывает:
-
BufferOverflowException- Если в этом буфере недостаточно места -
ReadOnlyBufferException- Если этот буфер только для чтения
hasArray
public final boolean hasArray()
Указывает, поддерживается ли этот буфер доступным массивом байт.
Если этот метод возвращает true, то методы array и arrayOffset могут быть безопасно вызваны.
- Определено в:
-
hasArrayв классеBuffer - Возвращает:
-
trueтолько в том случае, если этот буфер поддерживается массивом и не является только для чтения
array
public final byte[] array()
Возвращает массив байт, который поддерживает этот буфер (необязательная операция).
Изменения в содержимом этого буфера приведут к изменению содержимого возвращенного массива, и наоборот.
Вызовите метод hasArray перед вызовом этого метода, чтобы убедиться, что этот буфер имеет доступный поддерживающий массив.
- Определено в:
-
arrayв классеBuffer - Возвращает:
- Массив, который поддерживает этот буфер
- Выбрасывает:
-
ReadOnlyBufferException- Если этот буфер поддерживается массивом, но является только для чтения -
UnsupportedOperationException- Если этот буфер не поддерживается доступным массивом
arrayOffset
public final int arrayOffset()
Возвращает смещение в поддерживающем массиве этого буфера первого элемента буфера (необязательная операция).
Если этот буфер поддерживается массивом, то позиция буфера p соответствует индексу массива p + arrayOffset().
Вызовите метод hasArray перед вызовом этого метода, чтобы убедиться, что этот буфер имеет доступный поддерживающий массив.
- Определено в:
-
arrayOffsetв классеBuffer - Возвращает:
- Смещение в массиве этого буфера первого элемента буфера
- Выбрасывает:
-
ReadOnlyBufferException- Если этот буфер поддерживается массивом, но является только для чтения -
UnsupportedOperationException- Если этот буфер не поддерживается доступным массивом
compact
public abstract ByteBuffer compact()
Уплотняет этот буфер (необязательная операция).
Байты между текущей позицией буфера и его границей (если таковые имеются) копируются в начало буфера. То есть, байт с индексом p = position() копируется в индекс ноль, байт с индексом p + 1 копируется в индекс один, и так далее, пока байт с индексом limit() - 1 не будет скопирован в индекс n = 1 - 1 - p. Затем позиция буфера устанавливается в n+1, а граница устанавливается в его емкость. Отметка, если определена, отбрасывается.
Позиция буфера устанавливается в количество скопированных байтов, а не в ноль, чтобы вызов этого метода можно было немедленно последовать вызовом другого метода относительного копирования.
Вызовите этот метод после записи данных из буфера в случае, если запись была неполной. Например, следующий цикл копирует байты из одного канала в другой через буфер buf:
buf.clear(); // Prepare buffer for use
while (in.read(buf) >= 0 || buf.position != 0) {
buf.flip();
out.write(buf);
buf.compact(); // In case of partial write
}
- Возвращает:
- Этот буфер
- Выбрасывает:
-
ReadOnlyBufferException- Если этот буфер только для чтения
isDirect
public abstract boolean isDirect()
Указывает, является ли этот буфер байт буфером прямого доступа.
- Определено в:
-
isDirectв классеBuffer - Возвращает:
-
trueесли и только если этот буфер является буфером прямого доступа
toString
public String toString()
Возвращает строку, обобщающую состояние этого буфера.
hashCode
public int hashCode()
Возвращает текущий код хэширования этого буфера.
Код хэширования буфера байт зависит только от оставшихся элементов; то есть, от элементов с position() до и включая элемент в limit() - 1.
Поскольку коды хэширования буферов зависят от содержимого, не рекомендуется использовать буферы в качестве ключей в картах хэшей или подобных структурах данных, если не известно, что их содержимое не изменится.
- Переопределяет:
-
hashCodeв классеObject - Возвращает:
- Текущий код хэширования этого буфера
- См. также:
-
Object.equals(java.lang.Object),System.identityHashCode(java.lang.Object)
equals
public boolean equals(Object ob)
Определяет, равен ли этот буфер другому объекту.
Два буфера байтов равны тогда и только тогда, когда
У них одинаковый тип элемента,
У них одинаковое количество оставшихся элементов, и
Две последовательности оставшихся элементов, рассматриваемые независимо от их начальных позиций, точечно равны.
Буфер байт не равен ни одному другому типу объекта.
- Переопределяет:
-
equalsв классеObject - Параметры:
-
ob- Объект, с которым будет сравниваться этот буфер - Возвращает:
-
trueесли и только если этот буфер равен заданному объекту - См. также:
-
Object.hashCode(),HashMap
compareTo
public int compareTo(ByteBuffer that)
Сравнивает этот буфер с другим.
Два буфера байт сравниваются путем лексикографического сравнения их последовательностей оставшихся элементов, не обращая внимания на начальную позицию каждой последовательности в соответствующем буфере. Пары элементов byte сравниваются как если бы вызывалась Byte.compare(byte,byte).
Буфер байт не сравнивается ни с каким другим типом объекта.
- Определено в:
-
compareToв интерфейсеComparable<ByteBuffer> - Параметры:
-
that- объект для сравнения. - Возвращает:
- Отрицательное целое число, ноль или положительное целое число, в зависимости от того, меньше ли, равен ли или больше ли этот буфер, чем заданный буфер
mismatch
public int mismatch(ByteBuffer that)
Находит и возвращает относительный индекс первого несовпадения между этим буфером и заданным буфером. Индекс относителен к position каждого буфера и будет в диапазоне от 0 (включительно) до меньшего из remaining элементов в каждом буфере (исключительно).
Если два буфера имеют общую префиксную часть, то возвращаемый индекс равен длине этой общей префиксной части, и это означает, что несовпадение между двумя буферами происходит на этом индексе в соответствующих буферах. Если один буфер является правильным префиксом другого, то возвращаемый индекс равен меньшему из оставшихся элементов в каждом буфере, и это означает, что индекс действителен только для буфера с большим количеством оставшихся элементов. В противном случае несовпадения нет.
- Параметры:
-
that- Байтовый буфер, который будет проверен на несовпадение с этим буфером - Возвращает:
- Относительный индекс первого несовпадения между этим и заданным буфером, в противном случае -1, если несовпадения нет.
- С:
- 11
order
public final ByteOrder order()
Получает порядок байтов этого буфера.
Порядок байтов используется при чтении или записи многобайтовых значений и при создании буферов, которые являются представлениями этого байтового буфера. Порядок байтов нового байтового буфера всегда BIG_ENDIAN.
- Возвращает:
- Порядок байтов этого буфера
order
public final ByteBuffer order(ByteOrder bo)
Изменяет порядок байтов этого буфера.
- Параметры:
-
bo- Новый порядок байтов, либоBIG_ENDIAN, либоLITTLE_ENDIAN - Возвращает:
- Этот буфер
alignmentOffset
public final int alignmentOffset(int index,
int unitSize) Возвращает адрес памяти, указывающий на байт с заданным индексом, по модулю заданного размера единицы.
Значение больше нуля указывает на то, что адрес байта с указанным индексом не выровнен для размера единицы, а величина значения указывает, насколько необходимо увеличить или уменьшить индекс для нахождения байта с выровненным адресом. В противном случае значение 0 указывает на то, что адрес байта с указанным индексом выровнен для размера единицы.
- Примечание API:
- Этот метод может использоваться для определения, могут ли байты размера единицы с указанного индекса быть обработаны атомарно, если это поддерживается целевой платформой.
- Примечание реализации:
- Это реализация выбрасывает
UnsupportedOperationExceptionдля непрямых буферов, когда заданный размер единицы больше8. - Параметры:
-
index- Индекс для запроса смещения выравнивания, должен быть неотрицательным, проверка верхних границ не выполняется -
unitSize- Размер единицы в байтах, должен быть степенью2 - Возвращает:
- Адрес памяти байта с индексом по модулю размера единицы
- Исключения:
-
IllegalArgumentException- Если индекс отрицательный или размер единицы не является степенью2 -
UnsupportedOperationException- Если целевая платформа не гарантирует стабильные значения смещения выравнивания для заданного размера единицы при управлении областями памяти буферов того же типа, что и этот буфер (прямой или непрямой). Например, если сборка мусора приведет к перемещению области памяти, покрытой непрямым буфером, из одного места в другое, и оба места имеют разные характеристики выравнивания. - С:
- 9
- См. также:
alignedSlice(int)
alignedSlice
public final ByteBuffer alignedSlice(int unitSize)
Создает новый байтовый буфер, чье содержимое является совмещенной и выровненной подпоследовательностью содержимого этого буфера.
Содержимое нового буфера будет начинаться с текущей позиции этого буфера, округляясь вверх до индекса ближайшего выровненного байта для заданного размера единицы, и заканчиваться пределом этого буфера, округляясь вниз до индекса ближайшего выровненного байта для заданного размера единицы. Если округление приводит к значениям вне границ, то емкость и предел нового буфера будут равны нулю. Если округление находится в пределах границ, то для нового буфера nb и размера единицы unitSize будут верны следующие выражения:
nb.alignmentOffset(0, unitSize) == 0 nb.alignmentOffset(nb.limit(), unitSize) == 0
Изменения в содержимом этого буфера будут видны в новом буфере, и наоборот; позиция, предел и метка двух буферов будут независимыми.
Позиция нового буфера будет равна нулю, его емкость и предел будут равны количеству оставшихся байтов в этом буфере или меньше, в зависимости от выравнивания, метка будет неопределенной, а порядок байтов будет BIG_ENDIAN. Новый буфер будет прямым только в том случае, если этот буфер является прямым, и он будет только для чтения, если и только если этот буфер является только для чтения.
- Примечание API:
- Этот метод может использоваться для создания нового буфера, где байты размера единицы с индекса, который является кратным размеру единицы, могут быть обработаны атомарно, если это поддерживается целевой платформой.
- Примечание реализации:
- Это реализация выбрасывает
UnsupportedOperationExceptionдля непрямых буферов, когда заданный размер единицы больше8. - Параметры:
-
unitSize- Размер единицы в байтах, должен быть степенью2 - Возвращает:
- Новый байтовый буфер
- Исключения:
-
IllegalArgumentException- Если размер единицы не является степенью2 -
UnsupportedOperationException- Если целевая платформа не гарантирует стабильные выровненные срезы для заданного размера единицы при управлении областями памяти буферов того же типа, что и этот буфер (прямой или непрямой). Например, если сборка мусора приведет к перемещению области памяти, покрытой непрямым буфером, из одного места в другое, и оба места имеют разные характеристики выравнивания. - С:
- 9
- См. также:
-
alignmentOffset(int, int),slice()
getChar
public abstract char getChar()
Относительный метод get для чтения значения char.
Читает следующие два байта в текущей позиции этого буфера, комбинирует их в значение char в соответствии с текущим порядком байтов и затем увеличивает позицию на два.
- Возвращает:
- Значение char в текущей позиции буфера
- Исключения:
-
BufferUnderflowException- Если в этом буфере осталось меньше двух байтов
putChar
public abstract ByteBuffer putChar(char value)
Относительный метод put для записи значения char (дополнительная операция).
Записывает два байта, содержащие данное значение char, в текущем порядке байтов, в этот буфер в текущей позиции, а затем увеличивает позицию на два.
- Параметры:
-
value- Значение char, которое должно быть записано - Возвращает:
- Этот буфер
- Исключения:
-
BufferOverflowException- Если в этом буфере осталось меньше двух байтов -
ReadOnlyBufferException- Если этот буфер только для чтения
getChar
public abstract char getChar(int index)
Абсолютный метод get для чтения значения char.
Читает два байта по заданному индексу, объединяет их в значение char в соответствии с текущим порядком байтов.
- Параметры:
-
index- Индекс, с которого будут читаться байты - Возвращает:
- Значение char по заданному индексу
- Исключения:
-
IndexOutOfBoundsException- Еслиindexотрицателен или не меньше предела буфера минус один
putChar
public abstract ByteBuffer putChar(int index,
char value) Абсолютный метод put для записи значения char (дополнительная операция).
Записывает два байта, содержащие данное значение char, в текущем порядке байтов, в этот буфер по заданному индексу.
- Параметры:
-
index- Индекс, в который будут записаны байты -
value- Значение char, которое должно быть записано - Возвращает:
- Этот буфер
- Исключения:
-
IndexOutOfBoundsException- Еслиindexотрицателен или не меньше предела буфера минус один -
ReadOnlyBufferException- Если этот буфер только для чтения
asCharBuffer
public abstract CharBuffer asCharBuffer()
Создает представление этого байтового буфера как буфера char.
Содержимое нового буфера начнется с текущей позиции этого буфера. Изменения в содержимом этого буфера будут видны в новом буфере, и наоборот; позиции, пределы и метки двух буферов будут независимыми.
Позиция нового буфера будет равна нулю, его емкость и предел будут равны числу оставшихся байтов в этом буфере, деленному на два, метка будет неопределенной, а порядок байтов будет таким, как у байтового буфера в момент создания представления. Новый буфер будет прямым только в том случае, если этот буфер является прямым, и он будет только для чтения, если и только если этот буфер является только для чтения.
- Возвращает:
- Новый буфер char
getShort
public abstract short getShort()
Относительный метод get для чтения значения short.
Читает следующие два байта в текущей позиции этого буфера, комбинирует их в значение short в соответствии с текущим порядком байтов и затем увеличивает позицию на два.
- Возвращает:
- Значение short в текущей позиции буфера
- Исключения:
-
BufferUnderflowException- Если в этом буфере осталось меньше двух байтов
putShort
public abstract ByteBuffer putShort(short value)
Относительный метод put для записи значения short (дополнительная операция).
Записывает два байта, содержащие данное значение short, в текущем порядке байтов, в этот буфер в текущей позиции, а затем увеличивает позицию на два.
- Параметры:
-
value- Значение short, которое должно быть записано - Возвращает:
- Этот буфер
- Исключения:
-
BufferOverflowException- Если в этом буфере осталось меньше двух байтов -
ReadOnlyBufferException- Если этот буфер только для чтения
getShort
public abstract short getShort(int index)
Абсолютный метод get для чтения значения short.
Читает два байта по заданному индексу, объединяет их в значение short в соответствии с текущим порядком байтов.
- Параметры:
-
index- Индекс, с которого будут читаться байты - Возвращает:
- Значение short по заданному индексу
- Исключения:
-
IndexOutOfBoundsException- Еслиindexотрицателен или не меньше предела буфера минус один
putShort
public abstract ByteBuffer putShort(int index,
short value) Метод put для записи короткого значения (необязательная операция).
Записывает два байта, содержащие заданное короткое значение, в текущем порядке байтов, в этот буфер по указанному индексу.
- Параметры:
-
index- Индекс, в котором будут записаны байты -
value- Короткое значение, которое будет записано - Возвращает:
- Этот буфер
- Исключение:
-
IndexOutOfBoundsException- Еслиindexотрицательно или не меньше предела буфера, минус один -
ReadOnlyBufferException- Если этот буфер только для чтения
asShortBuffer
public abstract ShortBuffer asShortBuffer()
Создаёт представление этого буфера байтов как буфера коротких значений.
Содержимое нового буфера начнётся с текущей позиции этого буфера. Изменения в содержимом этого буфера будут видны в новом буфере, и наоборот; позиции, пределы и метки двух буферов будут независимы.
Позиция нового буфера будет равна нулю, его ёмкость и предел будут равны числу оставшихся байтов в этом буфере, делённому на два, метка будет неопределённой, а порядок байтов будет таким же, как у буфера байтов в момент создания представления. Новый буфер будет прямым, если и только если этот буфер является прямым, и он будет только для чтения, если и только если этот буфер является только для чтения.
- Возвращает:
- Новый буфер коротких значений
getInt
public abstract int getInt()
Метод get для чтения значения int.
Считывает следующие четыре байта в текущей позиции этого буфера, объединяет их в значение int в соответствии с текущим порядком байтов, а затем увеличивает позицию на четыре.
- Возвращает:
- Значение int в текущей позиции буфера
- Исключение:
-
BufferUnderflowException- Если в этом буфере осталось меньше четырёх байтов
putInt
public abstract ByteBuffer putInt(int value)
Метод put для записи значения int (необязательная операция).
Записывает четыре байта, содержащие заданное значение int, в текущем порядке байтов, в этот буфер по текущей позиции и затем увеличивает позицию на четыре.
- Параметры:
-
value- Значение int, которое будет записано - Возвращает:
- Этот буфер
- Исключение:
-
BufferOverflowException- Если в этом буфере осталось меньше четырёх байтов -
ReadOnlyBufferException- Если этот буфер только для чтения
getInt
public abstract int getInt(int index)
Абсолютный метод get для чтения значения int.
Считывает четыре байта по указанному индексу, объединяет их в значение int в соответствии с текущим порядком байтов.
- Параметры:
-
index- Индекс, с которого будут считываться байты - Возвращает:
- Значение int по заданному индексу
- Исключение:
-
IndexOutOfBoundsException- Еслиindexотрицательно или не меньше предела буфера, минус три
putInt
public abstract ByteBuffer putInt(int index,
int value) Абсолютный метод put для записи значения int (необязательная операция).
Записывает четыре байта, содержащие заданное значение int, в текущем порядке байтов, в этот буфер по указанному индексу.
- Параметры:
-
index- Индекс, в котором будут записаны байты -
value- Значение int, которое будет записано - Возвращает:
- Этот буфер
- Исключение:
-
IndexOutOfBoundsException- Еслиindexотрицательно или не меньше предела буфера, минус три -
ReadOnlyBufferException- Если этот буфер только для чтения
asIntBuffer
public abstract IntBuffer asIntBuffer()
Создаёт представление этого буфера байтов как буфера целых значений.
Содержимое нового буфера начнётся с текущей позиции этого буфера. Изменения в содержимом этого буфера будут видны в новом буфере, и наоборот; позиции, пределы и метки двух буферов будут независимы.
Позиция нового буфера будет равна нулю, его ёмкость и предел будут равны числу оставшихся байтов в этом буфере, делённому на четыре, метка будет неопределённой, а порядок байтов будет таким же, как у буфера байтов в момент создания представления. Новый буфер будет прямым, если и только если этот буфер является прямым, и он будет только для чтения, если и только если этот буфер является только для чтения.
- Возвращает:
- Новый буфер целых значений
getLong
public abstract long getLong()
Метод get для чтения значения long.
Считывает следующие восемь байтов в текущей позиции этого буфера, объединяет их в значение long в соответствии с текущим порядком байтов, а затем увеличивает позицию на восемь.
- Возвращает:
- Значение long в текущей позиции буфера
- Исключение:
-
BufferUnderflowException- Если в этом буфере осталось меньше восьми байтов
putLong
public abstract ByteBuffer putLong(long value)
Метод put для записи значения long (необязательная операция).
Записывает восемь байтов, содержащих заданное значение long, в текущем порядке байтов, в этот буфер по текущей позиции и затем увеличивает позицию на восемь.
- Параметры:
-
value- Значение long, которое будет записано - Возвращает:
- Этот буфер
- Исключение:
-
BufferOverflowException- Если в этом буфере осталось меньше восьми байтов -
ReadOnlyBufferException- Если этот буфер только для чтения
getLong
public abstract long getLong(int index)
Абсолютный метод get для чтения значения long.
Считывает восемь байтов по указанному индексу, объединяет их в значение long в соответствии с текущим порядком байтов.
- Параметры:
-
index- Индекс, с которого будут считываться байты - Возвращает:
- Значение long по заданному индексу
- Исключение:
-
IndexOutOfBoundsException- Еслиindexотрицательно или не меньше предела буфера, минус семь
putLong
public abstract ByteBuffer putLong(int index,
long value) Абсолютный метод put для записи значения long (необязательная операция).
Записывает восемь байтов, содержащих заданное значение long, в текущем порядке байтов, в этот буфер по указанному индексу.
- Параметры:
-
index- Индекс, в котором будут записаны байты -
value- Значение long, которое будет записано - Возвращает:
- Этот буфер
- Исключение:
-
IndexOutOfBoundsException- Еслиindexотрицательно или не меньше предела буфера, минус семь -
ReadOnlyBufferException- Если этот буфер только для чтения
asLongBuffer
public abstract LongBuffer asLongBuffer()
Создаёт представление этого буфера байтов как буфера длинных значений.
Содержимое нового буфера начнётся с текущей позиции этого буфера. Изменения в содержимом этого буфера будут видны в новом буфере, и наоборот; позиции, пределы и метки двух буферов будут независимы.
Позиция нового буфера будет равна нулю, его ёмкость и предел будут равны числу оставшихся байтов в этом буфере, делённому на восемь, метка будет неопределённой, а порядок байтов будет таким же, как у буфера байтов в момент создания представления. Новый буфер будет прямым, если и только если этот буфер является прямым, и он будет только для чтения, если и только если этот буфер является только для чтения.
- Возвращает:
- Новый буфер длинных значений
getFloat
public abstract float getFloat()
Метод get для чтения значения float.
Считывает следующие четыре байта в текущей позиции этого буфера, объединяет их в значение float в соответствии с текущим порядком байтов, а затем увеличивает позицию на четыре.
- Возвращает:
- Значение float в текущей позиции буфера
- Исключение:
-
BufferUnderflowException- Если в этом буфере осталось меньше четырёх байтов
putFloat
public abstract ByteBuffer putFloat(float value)
Метод put для записи значения float (необязательная операция).
Записывает четыре байта, содержащие заданное значение float, в текущем порядке байтов, в этот буфер по текущей позиции и затем увеличивает позицию на четыре.
- Параметры:
-
value- Значение float, которое будет записано - Возвращает:
- Этот буфер
- Исключение:
-
BufferOverflowException- Если в этом буфере осталось меньше четырёх байтов -
ReadOnlyBufferException- Если этот буфер только для чтения
getFloat
public abstract float getFloat(int index)
Абсолютный метод get для чтения значения float.
Считывает четыре байта по указанному индексу, объединяет их в значение float в соответствии с текущим порядком байтов.
- Параметры:
-
index- Индекс, с которого будут считываться байты - Возвращает:
- Значение float по заданному индексу
- Исключение:
-
IndexOutOfBoundsException- Еслиindexотрицательно или не меньше предела буфера, минус три
putFloat
public abstract ByteBuffer putFloat(int index,
float value) Абсолютный метод put для записи значения float (необязательная операция).
Записывает четыре байта, содержащие заданное значение float, в текущем порядке байтов, в этот буфер по указанному индексу.
- Параметры:
-
index- Индекс, в котором будут записаны байты -
value- Значение float, которое будет записано - Возвращает:
- Этот буфер
- Исключение:
-
IndexOutOfBoundsException- Еслиindexотрицательно или не меньше предела буфера, минус три -
ReadOnlyBufferException- Если этот буфер только для чтения
asFloatBuffer
public abstract FloatBuffer asFloatBuffer()
Создаёт представление этого буфера байтов как буфера значений с плавающей точкой.
Содержимое нового буфера начнётся с текущей позиции этого буфера. Изменения в содержимом этого буфера будут видны в новом буфере, и наоборот; позиции, пределы и метки двух буферов будут независимы.
Позиция нового буфера будет равна нулю, его ёмкость и предел будут равны числу оставшихся байтов в этом буфере, делённому на четыре, метка будет неопределённой, а порядок байтов будет таким же, как у буфера байтов в момент создания представления. Новый буфер будет прямым, если и только если этот буфер является прямым, и он будет только для чтения, если и только если этот буфер является только для чтения.
- Возвращает:
- Новый буфер значений с плавающей точкой
getDouble
public abstract double getDouble()
Метод get для чтения значения double.
Считывает следующие восемь байтов в текущей позиции этого буфера, объединяет их в значение double в соответствии с текущим порядком байтов, а затем увеличивает позицию на восемь.
- Возвращает:
- Значение типа double в текущей позиции буфера
- Изволяет:
-
BufferUnderflowException- Если в этом буфере осталось меньше восьми байтов
putDouble
public abstract ByteBuffer putDouble(double value)
Относительный метод put для записи значения типа double (необязательная операция).
Записывает восемь байтов, содержащих заданное значение типа double, в текущем порядке байтов, в этот буфер по текущей позиции, а затем увеличивает позицию на восемь.
- Параметры:
-
value- Значение типа double, которое должно быть записано - Возвращает:
- Этот буфер
- Изволяет:
-
BufferOverflowException- Если в этом буфере осталось меньше восьми байтов -
ReadOnlyBufferException- Если этот буфер только для чтения
getDouble
public abstract double getDouble(int index)
Абсолютный метод get для чтения значения типа double.
Читает восемь байтов по заданному индексу, составляя их в значение типа double в соответствии с текущим порядком байтов.
- Параметры:
-
index- Индекс, с которого будут читаться байты - Возвращает:
- Значение типа double по заданному индексу
- Изволяет:
-
IndexOutOfBoundsException- Еслиindexотрицательно или не меньше, чем предел буфера, минус семь
putDouble
public abstract ByteBuffer putDouble(int index,
double value) Абсолютный метод put для записи значения типа double (необязательная операция).
Записывает восемь байтов, содержащих заданное значение типа double, в текущем порядке байтов, в этот буфер по заданному индексу.
- Параметры:
-
index- Индекс, в котором будут записаны байты -
value- Значение типа double, которое должно быть записано - Возвращает:
- Этот буфер
- Изволяет:
-
IndexOutOfBoundsException- Еслиindexотрицательно или не меньше, чем предел буфера, минус семь -
ReadOnlyBufferException- Если этот буфер только для чтения
asDoubleBuffer
public abstract DoubleBuffer asDoubleBuffer()
Создает представление этого байтового буфера как буфера типа double.
Содержимое нового буфера начнется с текущей позиции этого буфера. Изменения в содержимом этого буфера будут видны в новом буфере, и наоборот; позиция, предел и метка двух буферов будут независимыми.
Позиция нового буфера будет равна нулю, его емкость и его предел будут равны количеству оставшихся байтов в этом буфере, деленному на восемь, метка будет неопределенной, а порядок байтов будет таким же, как у байтового буфера в момент создания представления. Новый буфер будет прямым только в том случае, если этот буфер является прямым, и он будет только для чтения, только если этот буфер является только для чтения.
- Возвращает:
- Новый буфер типа double
© 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/ByteBuffer.html