2013-02-09 25 views
60

Perché il metodo flip() di ByteBuffer si chiama "flip"? Cosa è "capovolto" qui? Secondo apidoc, due lanci successivi non ripristineranno lo stato originale, e più lanci probabilmente tenderanno a limit() a diventare zero.Qual è lo scopo del metodo di scorrimento di ByteBuffer? (E perché si chiama "flip"?)

Posso "sbloccare" in qualche modo per riutilizzare i byte usciti da un limite?

Posso concatenare coda per essere invertita con altri dati?

+1

Esso "capta" il buffer da lettura a scrittura (e viceversa). http://thushw.blogspot.com/2009/10/java-bytebuffer-how-does-this-work.html –

+1

@BrianRoach: Si gira da leggere a scrivere ma non è così utile per scrivere da leggere a meno che non si stia scrivendo strutture a dimensione fissa. Per lanciare a leggere da leggere, usa invece 'reset'. – nneonneo

+0

Ricordarsi di porre domande "oggettive"; o, almeno, fai sembrare la domanda predominante obiettiva: D –

risposta

83

Un caso di uso abbastanza comune per ByteBuffer consiste nel costruire una struttura dati pezzo per pezzo e quindi scrivere l'intera struttura su disco. flip viene utilizzato per capovolgere il ByteBuffer da "lettura da I/O" (put ting) per "scrivere a I/O" (get ting): dopo una sequenza di put s viene utilizzato per riempire la ByteBuffer, flip imposterà il limite del buffer alla posizione corrente e ripristinare la posizione a zero. Questo ha l'effetto di creare un futuro get o write dal buffer scrivendo tutto ciò che era put nel buffer e non di più.

Dopo aver terminato il put, si potrebbe desiderare di riutilizzare l'ByteBuffer di costruire un'altra struttura di dati. Per "sbloccarlo", chiamare clear. Questo reimposta il limite alla capacità (facendo tutti del buffer utilizzabile), e la posizione a 0.

Così, un tipico scenario di utilizzo:

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); 
} 
+0

Che cos'è un tipo di "out"? –

+0

Un 'WritableByteChannel', come' FileChannel' o 'SocketChannel'. – nneonneo

+5

O qualsiasi altra cosa che abbia un metodo 'write (ByteBuffer)'. (Non è veramente rilevante quale sia il suo tipo ...) –

1

ByteBuffer è mal progettato. Ci sono molte lamentele da parte di programmatori decenti.

Quindi non cercare di ragionare, basta studiare e utilizzare l'API con attenzione.

Ora non posso badmouth senza presentare un'alternativa, ecco che è:

Un buffer è fisso capacity; mantiene 2 puntatori: start e end. get() restituisce il byte nella posizione start e incrementa start. put() inserisce il byte nella posizione end e incrementa end. No flip()!

+0

[[citazione necessaria]] (Non ho sentito queste lamentele su 'ByteBuffer'). Inoltre, i documenti dicono che c'è solo una "posizione attuale", non un "inizio" e "fine". – nneonneo

+0

Ho sentito, puoi credermi sulla parola. – irreputable

+3

Quindi, quali sono i reclami? Se hai qualche lamentela personale va bene, ma non basta dire "X API fa schifo, la gente ha detto così". – nneonneo