--- old/src/java.base/share/classes/java/io/OutputStream.java 2017-12-07 11:22:35.000000000 -0800 +++ new/src/java.base/share/classes/java/io/OutputStream.java 2017-12-07 11:22:34.000000000 -0800 @@ -47,6 +47,56 @@ */ public abstract class OutputStream implements Closeable, Flushable { /** + * Returns a new {@code OutputStream} which discards all bytes. The + * returned stream is initially open. The stream is closed by calling + * the {@code close()} method. Subsequent calls to {@code close()} have + * no effect. + * + *

While the stream is open, the {@code write(int)}, {@code + * write(byte[])}, and {@code write(byte[], int, int)} methods do nothing. + * After the stream has been closed, these methods all throw {@code + * IOException}. + * + *

The {@code flush()} method does nothing. + * + * @return an {@code OutputStream} which discards all bytes + * + * @since 10 + */ + public static OutputStream nullStream() { + return new OutputStream() { + private volatile boolean closed; + + private void ensureOpen() throws IOException { + if (closed) { + throw new IOException("Stream closed"); + } + } + + @Override + public void write(int b) throws IOException { + ensureOpen(); + } + + @Override + // overridden for efficiency + public void write(byte b[], int off, int len) throws IOException { + if (b == null) { + throw new NullPointerException(); + } else if (off < 0 || len < 0 || len > b.length - off) { + throw new IndexOutOfBoundsException(); + } + ensureOpen(); + } + + @Override + public void close() { + closed = true; + } + }; + } + + /** * Writes the specified byte to this output stream. The general * contract for write is that one byte is written * to the output stream. The byte to be written is the eight