Почему метод ByteBuffer flip () называется «flip»? Что здесь "перевернуто"? Согласно apidoc, два последовательных переворота не восстановят исходное состояние, а несколько переворотов, вероятно, будут иметь тенденцию limit()
к нулю.
Могу ли я как-нибудь "развернуть", чтобы повторно использовать байты, вышедшие за предел?
Могу ли я объединить хвост, который нужно перевернуть, с другими данными?
java
flip
bytebuffer
Сьюзан Чиок
источник
источник
reset
вместо этого.Ответы:
Один довольно распространенный вариант использования
ByteBuffer
- это построение некоторой структуры данных по частям, а затем запись всей этой структуры на диск.flip
используется для переключенияByteBuffer
от «чтения из ввода / вывода» (put
ting) к «записи в ввод / вывод» (get
ting): после того, как последовательностьput
s используется для заполненияByteBuffer
,flip
устанавливает предел буфера в текущую позицию и сбросьте позицию на ноль. Это приводит к тому, что будущееget
илиwrite
буфер записывают все, что былоput
в буфер, и не более того.После завершения
put
вы можете повторно использоватьByteBuffer
для построения другой структуры данных. Чтобы "развернуть" его, позвонитеclear
. Это сбрасывает предел емкости (делая весь буфер пригодным для использования) и позицию до 0.Итак, типичный сценарий использования:
ByteBuffer b = new ByteBuffer(1024); for(int i=0; i<N; i++) { b.clear(); b.put(header[i]); b.put(data[i]); b.flip(); out.write(b); }
источник
out
?write(ByteBuffer)
метод. (На самом деле не имеет значения, какой это тип ...)Buffer.clear
сбросить ограничение на емкость и положение на 0.Buffer.reset
Сбросить только положение наmark
.Flip назначает текущее значение позиции свойству limit и устанавливает свойство position равным 0. Flip полезен только для слива активных элементов из буфера.
Например, ниже программа выводит «привет» не пустые элементы буфера. Лимит вызовов методов и положение можно заменить на флип.
CharBuffer cbuff = CharBuffer.allocate(40); cbuff.put("hello"); // what below two line of code is what flip does cbuff.limit(cbuff.position()); cbuff.position(0); while(cbuff.hasRemaining()) { System.out.println(cbuff.get()); }
См. Http://www.zoftino.com/java-nio-tutorial для получения дополнительной информации о буферах и каналах.
источник
ByteBuffer плохо спроектирован. Очень много жалоб от порядочных программистов.
Так что не пытайтесь рассуждать об этом, просто внимательно изучите и используйте API.
Теперь я не могу ругать его, не представив альтернативы, так что вот она:
Буфер имеет фиксированный
capacity
; он поддерживает 2 указателя:start
иend
.get()
возвращает байт вstart
позиции и увеличивает егоstart
.put()
помещает байт вend
позицию и увеличивает егоend
. Нетflip()
!источник
кувырок()Метод подготавливает буфер для новой последовательности операций записи канала или относительного получения: он устанавливает предел в текущую позицию, а затем устанавливает позицию в ноль.
Buffer отслеживает записанные в него данные. После записи вызывается метод flip () для переключения из режима записи в режим чтения.
источник