2009-02-23 6 views
32

Je dois mettre le contenu d'un java.nio.ByteBuffer dans un java.io.OutputStream. (J'aimerais avoir un Channel à la place, mais je ne le fais pas) Quelle est la meilleure façon de le faire?Comment mettre le contenu d'un ByteBuffer dans un OutputStream?

Je ne peux pas utiliser la méthode array() de ByteBuffer car il peut s'agir d'un tampon en lecture seule.

Je peux également intercaler des écritures dans le OutputStream entre l'utilisation de ce ByteBuffer et un tableau régulier de byte[] que je peux utiliser avec OutputStream.write() directement.

Répondre

44

Regardez Channels.newChannel(OutputStream). Cela vous donnera un canal donné par OutputStream. Avec l'adaptateur WritableByteChannel vous pouvez fournir le ByteBuffer qui l'écrira à OutputStream.

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

    channel.write(buffer); 
} 

Cela devrait faire l'affaire!

+0

Si je conserve le canal ainsi que le flux, puis-je mélanger les appels aux deux? –

+0

Ya, bien sûr, réduit le coût de création du canal à chaque fois :) –

+8

Notez que cette approche implique la copie à partir du ByteBuffer dans un tableau temporaire qui est ensuite écrit dans le OutputStream. Si les performances sont importantes, vous devrez peut-être procéder à un refactoring afin d'éviter les copies de blocs inutiles. –

Questions connexes