Sink
Receives a stream of bytes. Use this interface to write data wherever it's needed: to the network, storage, or a buffer in memory. Sinks may be layered to transform received data, such as to compress, encrypt, throttle, or add protocol framing.
Most application code shouldn't operate on a sink directly, but rather on a BufferedSink which is both more efficient and more convenient. Use buffer to wrap any sink with a buffer.
Sinks are easy to test: just use a Buffer in your tests, and read from it to confirm it received the data that was expected.
Comparison with OutputStream
This interface is functionally equivalent to java.io.OutputStream.
OutputStream
requires multiple layers when emitted data is heterogeneous: a DataOutputStream
for primitive values, a BufferedOutputStream
for buffering, and OutputStreamWriter
for charset encoding. This library uses BufferedSink
for all of the above.
Sink is also easier to layer: there is no java.io.OutputStream.write method that is awkward to implement efficiently.
Interop with OutputStream
Use sink to adapt an OutputStream
to a sink. Use BufferedSink.outputStream to adapt a sink to an OutputStream
.