2009-02-23 9 views
32

Potrzebuję umieścić zawartość java.nio.ByteBuffer w java.io.OutputStream. (Chciałbym mieć zamiast tego Channel, ale nie) Jaki jest najlepszy sposób na zrobienie tego?Jak umieścić zawartość ByteBuffer w OutputStream?

Nie mogę użyć metody ByteBuffer's array(), ponieważ może to być bufor tylko do odczytu.

Mogę również przeplatać zapisy do OutputStream między używaniem tego ByteBuffera i regularną tablicą z byte[], którą mogę bezpośrednio użyć.

Odpowiedz

44

Spójrz na Channels.newChannel(OutputStream). Daje ci kanał z danym strumieniem wyjściowym. Za pomocą adaptera WritableByteChannel możesz dostarczyć ByteBuffer, który zapisze go w OutputStream.

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

    channel.write(buffer); 
} 

To powinno wystarczyć!

+0

czy zachowam kanał, jak i strumień, czy mogę połączyć oba połączenia? –

+0

Ya, oczywiście może, zmniejsza koszt tworzenia kanału za każdym razem :) –

+8

Należy zauważyć, że podejście to polega na kopiowaniu z ByteBuffer do tymczasowej tablicy, która jest następnie zapisywana do OutputStream. Jeśli wydajność jest ważna, możesz potrzebować trochę refaktoryzacji, aby uniknąć niepotrzebnych blokowych kopii. –