Por que o método flip () de ByteBuffer é chamado de "flip"? O que é "invertido" aqui? De acordo com o apidoc, dois giros sucessivos não restaurarão o estado original e vários giros provavelmente tenderão limit()
a se tornar zero.
Posso "desviar" de alguma forma para reutilizar os bytes que ultrapassaram o limite?
Posso concatenar a cauda para ser invertida com alguns outros dados?
java
flip
bytebuffer
Suzan Cioc
fonte
fonte
reset
.Respostas:
Um caso de uso bastante comum para o
ByteBuffer
é construir alguma estrutura de dados peça por peça e, em seguida, gravar essa estrutura inteira no disco.flip
é usado para mudarByteBuffer
de "leitura de I / O" (put
ting) para "gravação de I / O" (get
ting): após uma sequência deput
s ser usada para preencher oByteBuffer
,flip
definirá o limite do buffer para a posição atual e redefinir a posição para zero. Isso tem o efeito de fazer um futuroget
ouwrite
do buffer gravar tudo o que estavaput
no buffer e nada mais.Depois de terminar o
put
, você pode querer reutilizar oByteBuffer
para construir outra estrutura de dados. Para "desviá-lo", ligueclear
. Isso redefine o limite da capacidade (tornando todo o buffer utilizável) e a posição para 0.Portanto, um cenário de uso típico:
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); }
fonte
WritableByteChannel
, comoFileChannel
ouSocketChannel
.write(ByteBuffer)
método. (Não é realmente relevante qual é o seu tipo ...)Buffer.clear
redefinir o limite para capacidade e posição para 0.Buffer.reset
redefinir apenas a posição paramark
.Flip atribui o valor da posição atual à propriedade limit e define a propriedade position para 0. Flip é útil para drenar apenas os elementos ativos de um buffer.
Por exemplo, o programa abaixo imprime "hello" e não os elementos vazios do buffer. O limite e a posição das chamadas de método podem ser substituídos com 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()); }
Consulte http://www.zoftino.com/java-nio-tutorial para obter mais informações sobre buffers e canais.
fonte
ByteBuffer é mal projetado. Há muitas reclamações de programadores decentes.
Portanto, não tente raciocinar sobre isso, apenas estude e use a API com cuidado.
Agora eu não posso falar mal disso sem apresentar uma alternativa, então aqui está:
Um buffer tem um fixo
capacity
; mantém 2 ponteiros:start
eend
.get()
retorna o byte nastart
posição e incrementosstart
.put()
coloca o byte naend
posição e incrementaend
. Nãoflip()
!fonte
O método flip () torna um buffer pronto para uma nova sequência de canais de gravação ou operações relativas de obtenção: Ele define o limite para a posição atual e, em seguida, define a posição para zero.
O Buffer rastreia os dados gravados nele. Após a escrita, o método flip () é chamado para alternar do modo de escrita para o modo de leitura.
fonte