< prev index next >

src/java.base/share/classes/java/io/InputStream.java

Print this page
rev 48211 : imported patch 4358774-nullISAndOS.01
rev 48210 : 4358774: Add null InputStream and OutputStream
Reviewed-by: reinhapa
rev 47920 : 8191516: OutputStream.write(byte[],int,int) could have fewer parameter bounds checks
Summary: Reduce parameter bounds checks from five to three as in InputStream::read
Reviewed-by: psandoz
rev 47216 : 8187443: Forest Consolidation: Move files to unified layout
Reviewed-by: darcy, ihse

*** 52,61 **** --- 52,162 ---- private static final int MAX_SKIP_BUFFER_SIZE = 2048; private static final int DEFAULT_BUFFER_SIZE = 8192; /** + * Returns a new {@code InputStream} that contains no 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. + * + * <p> While the stream is open, the {@code available()}, {@code read()}, + * {@code read(byte[])}, {@code read(byte[], int, int)}, + * {@code readAllBytes()}, {@code readNBytes()}, {@code skip()}, and + * {@code transferTo()} methods all behave as if end of stream has been + * reached. After the stream has been closed, these methods all throw + * {@code IOException}. + * + * <p> The {@code markSupported()} method returns {@code false}. The + * {@code mark()} method does nothing, and the {@code reset()} method + * throws {@code IOException}. + * + * @return an {@code InputStream} which contains no bytes + * + * @since 10 + */ + public static InputStream nullStream() { + return new InputStream() { + private volatile boolean closed; + + private void ensureOpen() throws IOException { + if (closed) { + throw new IOException("Stream closed"); + } + } + + @Override + public int available () throws IOException { + ensureOpen(); + return 0; + } + + @Override + public int read() throws IOException { + ensureOpen(); + return -1; + } + + @Override + public int read(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(); + } + if (len == 0) { + return 0; + } + ensureOpen(); + return -1; + } + + @Override + // overridden for efficiency + public byte[] readAllBytes() throws IOException { + ensureOpen(); + return new byte[0]; + } + + @Override + // overridden for efficiency + public int readNBytes(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(); + return 0; + } + + @Override + // overridden for efficiency + public long skip(long n) throws IOException { + ensureOpen(); + return 0L; + } + + @Override + // overridden for efficiency + public long transferTo(OutputStream out) throws IOException { + if (out == null) { + throw new NullPointerException(); + } + ensureOpen(); + return 0L; + } + + @Override + public void close() throws IOException { + closed = true; + } + }; + } + + /** * Reads the next byte of data from the input stream. The value byte is * returned as an <code>int</code> in the range <code>0</code> to * <code>255</code>. If no byte is available because the end of the stream * has been reached, the value <code>-1</code> is returned. This method * blocks until input data is available, the end of the stream is detected,
< prev index next >