--- old/src/java.base/share/classes/java/io/OutputStream.java 2017-12-06 10:54:23.000000000 -0800 +++ new/src/java.base/share/classes/java/io/OutputStream.java 2017-12-06 10:54:23.000000000 -0800 @@ -47,6 +47,51 @@ */ 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;
+
+ @Override
+ public void write(int b) throws IOException {
+ if (closed) {
+ throw new IOException("Stream closed");
+ }
+ }
+
+ @Override
+ // overridden for efficiency
+ public void write(byte b[], int off, int len) throws IOException {
+ Objects.requireNonNull(b);
+ Objects.checkFromIndexSize(off, len, b.length);
+ if (closed) {
+ throw new IOException("Stream closed");
+ }
+ }
+
+ @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