2009-02-23 14 views
32

Necesito poner el contenido de un java.nio.ByteBuffer en un java.io.OutputStream. (Ojalá tuviera un Channel en su lugar pero no lo sé) ¿Cuál es la mejor manera de hacerlo?¿Cómo poner el contenido de un ByteBuffer en un OutputStream?

no puedo usar el método de la ByteBuffer array() ya que puede ser un búfer de sólo lectura.

También puedo estar intercalando escrituras al OutputStream entre usar este ByteBuffer y tener una matriz regular de byte[] que puedo usar directamente con OutputStream.write().

Respuesta

44

Mira Channels.newChannel(OutputStream). Le dará un canal dado un OutputStream. Con el adaptador WritableByteChannel puede proporcionar el ByteBuffer que lo escribirá en OutputStream.

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

    channel.write(buffer); 
} 

¡Esto debería hacer el truco!

+0

si sigo el canal, así como la corriente, que puede entremezclar llamadas a ambos? –

+0

Ya, seguro posible, reduce el costo de crear el canal cada vez :) –

+8

Tenga en cuenta que este enfoque implica la copia de la ByteBuffer en una matriz temporal, que se escribirá a la OutputStream. Si el rendimiento es importante, es posible que deba hacer un poco de refactorización para evitar copias en bloque innecesarias. –

Cuestiones relacionadas