2016-02-05 23 views
5

Sono nuovo di Java NIO e non sono sicuro di come fare le cose nio-ishly.Come ottengo da un ByteBuffer con solo 1 byte rimanente (Java NIO)

Si supponga di aver letto alcuni dati da un socket in un ByteBuffer e di aver consumato tutti i byte tranne uno, utilizzando i metodi get di ByteBuffer. So che la prossima cosa sarà quattro byte con un numero intero in formato binario, quindi voglio usare getInt(), ma solo il primo byte dell'int è nel buffer.

La cosa naturale per me è riempire il buffer con alcuni byte in più dalla connessione e quindi continuare. Se ho capito bene, ho potuto ottenere questo con

buf.compact(); 
buf.position(buf.limit()); 
buf.limit(buf.capacity()); 

e quindi leggere più byte.

Poiché non esiste un metodo con tale comportamento, ma esiste il metodo flip(), mi chiedo se il mio modo di pensare sia sbagliato. Ci sono modi migliori per farlo?

Questa situazione si verifica naturalmente ad es. se la connessione fornisce un flusso di messaggi di lunghezza + dati.

+0

Nope no. Leggi attentamente la domanda ... si tratta di dati provenienti da un socket, in fase di buffering, e si dà il caso che il primo byte del numero intero sia "separato". Gli altri byte stanno arrivando, quindi, sarebbe sbagliato leggere un byte e lanciarlo. Ciò che l'OP vuole è aggrapparsi a quel byte fino a quando non sono noti gli altri 3 byte. – dcsohl

+0

@dcsohl hai ragione il mio errore – Pooya

+1

Dopo un 'compact()', il buffer è impostato per poter leggere più byte. Ancora una volta vengono letti i byte, 'flip()' e ne leggi altri. –

risposta

2
buf.compact(); 
// wrong: buf.position(buf.limit()); 
// no need to: buf.limit(buf.capacity()); 

Si prega di non modificare la posizione. La posizione dopo compact() punta al primo byte dopo la parte non rilasciata del buffer, esattamente dove lo si desidera.

Il limite di impostazione della capacità è ridondante: compact() lo fa già per te.