2009-02-23 8 views
32

Devo inserire il contenuto di java.nio.ByteBuffer in un java.io.OutputStream. (vorrei avere un Channel invece, ma non lo faccio) Qual è il modo migliore per farlo?Come inserire il contenuto di un ByteBuffer in un OutputStream?

non posso usare il metodo del ByteBuffer array() poiché può essere un buffer di sola lettura.

Inoltre, è possibile che le scritture intersperse vengano eseguite nell'outputtream tra l'utilizzo di questo ByteBuffer e l'utilizzo di una serie regolare di byte[] che è possibile utilizzare direttamente con OutputStream.write().

risposta

44

Guarda Channels.newChannel(OutputStream). Ti darà un canale dato un OutputStream. Con l'adattatore WritableByteChannel puoi fornire ByteBuffer che lo scriverà su OutputStream.

public void writeBuffer(ByteBuffer buffer, OutputStream stream) { 
    WritableByteChannel channel = Channels.newChannel(stream); 

    channel.write(buffer); 
} 

Questo dovrebbe fare il trucco!

+0

se tengo il canale così come il flusso, posso mischiare chiamate a entrambi? –

+0

Ya, certo può, riduce il costo della creazione del canale ogni volta :) –

+8

Si noti che questo approccio comporta la copia dal ByteBuffer in un array temporaneo che poi viene scritta OutputStream. Se le prestazioni sono importanti, potrebbe essere necessario eseguire un po 'di refactoring per evitare copie di blocco non necessarie. –