static ByteStreamMessage fromOutputStream(Consumer<? super OutputStream> outputStreamConsumer,
                                              Executor blockingTaskExecutor) {
        return new ByteStreamMessageOutputStream(outputStreamConsumer, blockingTaskExecutor);
    }
Creates a new {@link ByteStreamMessage} that publishes {@link HttpData}s from the specified
{@linkplain Consumer outputStreamConsumer}.

<p>For example:<pre>{@code
ByteStreamMessage byteStreamMessage = StreamMessage.fromOutputStream(os -> {
    try {
        for (int i = 0; i < 5; i++) {
            os.write(i);
        }
        os.close();
    } catch (IOException e) {
        throw new UncheckedIOException(e);
    }
});
byte[] result = byteStreamMessage.collectBytes().join();

assert Arrays.equals(result, new byte[] { 0, 1, 2, 3, 4 });
}</pre>

<p>Please note that the try-with-resources statement is not used to call {@code os.close()}
automatically. It's because when an exception is raised in the {@link Consumer},
the {@link OutputStream} is closed by the {@link StreamMessage} and the exception is propagated
to the {@link Subscriber} automatically.

@param blockingTaskExecutor the blocking task executor to execute {@link OutputStream#write(int)}
core/src/main/java/com/linecorp/armeria/common/stream/StreamMessage.java