APIdia Launch Partner
Top Description Fields Constructors Methods
java.io

public Class BufferedInputStream

extends FilterInputStream
Class Inheritance
Known Direct Subclasses
java.lang.ProcessImpl.ProcessPipeInputStream, java.lang.ProcessImpl.DeferredCloseProcessPipeInputStream
Imports
java.util.Arrays, .Objects, jdk.internal.misc.Unsafe, jdk.internal.util.ArraysSupport

A BufferedInputStream adds functionality to another input stream-namely, the ability to buffer the input and to support the mark and reset methods. When the BufferedInputStream is created, an internal buffer array is created. As bytes from the stream are read or skipped, the internal buffer is refilled as necessary from the contained input stream, many bytes at a time. The mark operation remembers a point in the input stream and the reset operation causes all the bytes read since the most recent mark operation to be reread before new bytes are taken from the contained input stream.

API Note

Once wrapped in a BufferedInputStream, the underlying InputStream should not be used directly nor wrapped with another stream.

Author
Arthur van Hoff
Since
1.0

Field Summary

Modifier and TypeField and Description
protected volatile byte[]
buf

The internal buffer array where the data is stored.

private static final long
protected int
count

The index one greater than the index of the last valid byte in the buffer.

private static final int
private static final byte[]
private final int
protected int
marklimit

The maximum read ahead allowed after a call to the mark method before subsequent calls to the reset method fail.

protected int
markpos

The value of the pos field at the time the last mark method was called.

protected int
pos

The current position in the buffer.

private static final Unsafe
U

As this class is used early during bootstrap, it's motivated to use Unsafe.compareAndSetReference instead of AtomicReferenceFieldUpdater (or VarHandles) to reduce dependencies and improve startup time.

Inherited from java.io.FilterInputStream:
in

Constructor Summary

AccessConstructor and Description
public
BufferedInputStream(InputStream
the underlying input stream.
in
)

Creates a BufferedInputStream and saves its argument, the input stream in, for later use.

public
BufferedInputStream(InputStream
the underlying input stream.
in
,
int
the buffer size.
size
)

Creates a BufferedInputStream with the specified buffer size, and saves its argument, the input stream in, for later use.

Method Summary

Modifier and TypeMethod and Description
public synchronized int

Returns:

an estimate of the number of bytes that can be read (or skipped over) from this input stream without blocking.
available
()

Overrides java.io.FilterInputStream.available.

Returns an estimate of the number of bytes that can be read (or skipped over) from this input stream without blocking by the next invocation of a method for this input stream.

public void
close()

Overrides java.io.FilterInputStream.close.

Implements java.io.Closeable.close.

Closes this input stream and releases any system resources associated with the stream.

private void
ensureOpen()

Throws IOException if the stream is closed (buf is null).

private void
fill()

Fills the buffer with more data, taking into account shuffling and other tricks for dealing with marks.

private byte[]
getBufIfOpen(boolean
true to allocate if empty
allocateIfEmpty
)

Returns the internal buffer, optionally allocating it if empty.

private byte[]
getBufIfOpen()

Returns the internal buffer, allocating it if empty.

private InputStream
getInIfOpen()

Check to make sure that underlying input stream has not been nulled out due to close; if not return it;

private static boolean

Returns:

true if this class is trusted
isTrusted
(OutputStream os)

Returns true if this class satisfies the following conditions:

  • does not retain a reference to the byte[]
  • does not leak a reference to the byte[] to non-trusted classes
  • does not modify the contents of the byte[]
  • write() method does not read the contents outside of the offset/length bounds
public synchronized void
mark(int
the maximum limit of bytes that can be read before the mark position becomes invalid.
readlimit
)

Overrides java.io.FilterInputStream.mark.

See the general contract of the mark method of InputStream.

public boolean

Returns:

a boolean indicating if this stream type supports the mark and reset methods.
markSupported
()

Overrides java.io.FilterInputStream.markSupported.

Tests if this input stream supports the mark and reset methods.

public synchronized int

Returns:

the next byte of data, or -1 if the end of the stream is reached.
read
()

Overrides java.io.FilterInputStream.read.

See the general contract of the read method of InputStream.

public synchronized int

Returns:

the number of bytes read, or -1 if the end of the stream has been reached.
read
(byte[]
destination buffer.
b
,
int
offset at which to start storing bytes.
off
,
int
maximum number of bytes to read.
len
)

Overrides java.io.FilterInputStream.read.

Reads bytes from this byte-input stream into the specified byte array, starting at the given offset.

private int
read1(byte[] b, int off, int len)

Read bytes into a portion of an array, reading from the underlying stream at most once if necessary.

public synchronized void
reset()

Overrides java.io.FilterInputStream.reset.

See the general contract of the reset method of InputStream.

public synchronized long
skip(long n)

Overrides java.io.FilterInputStream.skip.

See the general contract of the skip method of InputStream.

public synchronized long
transferTo(OutputStream out)

Overrides java.io.InputStream.transferTo.

Reads all bytes from this input stream and writes the bytes to the given output stream in the order that they are read.

Inherited from java.io.FilterInputStream:
read

Field Detail

bufback to summary
protected volatile byte[] buf

The internal buffer array where the data is stored. When necessary, it may be replaced by another array of a different size.

BUF_OFFSETback to summary
private static final long BUF_OFFSET
countback to summary
protected int count

The index one greater than the index of the last valid byte in the buffer. This value is always in the range 0 through buf.length; elements buf[0] through buf[count-1] contain buffered input data obtained from the underlying input stream.

DEFAULT_BUFFER_SIZEback to summary
private static final int DEFAULT_BUFFER_SIZE

Hides java.io.InputStream.DEFAULT_BUFFER_SIZE.

EMPTYback to summary
private static final byte[] EMPTY
initialSizeback to summary
private final int initialSize
marklimitback to summary
protected int marklimit

The maximum read ahead allowed after a call to the mark method before subsequent calls to the reset method fail. Whenever the difference between pos and markpos exceeds marklimit, then the mark may be dropped by setting markpos to -1.

See Also
java.io.BufferedInputStream#mark(int), java.io.BufferedInputStream#reset()
markposback to summary
protected int markpos

The value of the pos field at the time the last mark method was called.

This value is always in the range -1 through pos. If there is no marked position in the input stream, this field is -1. If there is a marked position in the input stream, then buf[markpos] is the first byte to be supplied as input after a reset operation. If markpos is not -1, then all bytes from positions buf[markpos] through buf[pos-1] must remain in the buffer array (though they may be moved to another place in the buffer array, with suitable adjustments to the values of count, pos, and markpos); they may not be discarded unless and until the difference between pos and markpos exceeds marklimit.

See Also
java.io.BufferedInputStream#mark(int), java.io.BufferedInputStream#pos
posback to summary
protected int pos

The current position in the buffer. This is the index of the next byte to be read from the buf array.

This value is always in the range 0 through count. If it is less than count, then buf[pos] is the next byte to be supplied as input; if it is equal to count, then the next read or skip operation will require more bytes to be read from the contained input stream.

See Also
java.io.BufferedInputStream#buf
Uback to summary
private static final Unsafe U

As this class is used early during bootstrap, it's motivated to use Unsafe.compareAndSetReference instead of AtomicReferenceFieldUpdater (or VarHandles) to reduce dependencies and improve startup time.

Constructor Detail

BufferedInputStreamback to summary
public BufferedInputStream(InputStream in)

Creates a BufferedInputStream and saves its argument, the input stream in, for later use. An internal buffer array is created and stored in buf.

Parameters
in:InputStream

the underlying input stream.

BufferedInputStreamback to summary
public BufferedInputStream(InputStream in, int size)

Creates a BufferedInputStream with the specified buffer size, and saves its argument, the input stream in, for later use. An internal buffer array of length size is created and stored in buf.

Parameters
in:InputStream

the underlying input stream.

size:int

the buffer size.

Exceptions
IllegalArgumentException:
if size <= 0.

Method Detail

availableback to summary
public synchronized int available() throws IOException

Overrides java.io.FilterInputStream.available.

Returns an estimate of the number of bytes that can be read (or skipped over) from this input stream without blocking by the next invocation of a method for this input stream. The next invocation might be the same thread or another thread. A single read or skip of this many bytes will not block, but may read or skip fewer bytes.

This method returns the sum of the number of bytes remaining to be read in the buffer (count - pos) and the result of calling the in.available().

Returns:int

an estimate of the number of bytes that can be read (or skipped over) from this input stream without blocking.

Exceptions
IOException:
if this input stream has been closed by invoking its close() method, or an I/O error occurs.
closeback to summary
public void close() throws IOException

Overrides java.io.FilterInputStream.close.

Implements java.io.Closeable.close.

Closes this input stream and releases any system resources associated with the stream. Once the stream has been closed, further read(), available(), reset(), or skip() invocations will throw an IOException. Closing a previously closed stream has no effect.

Exceptions
IOException:
if an I/O error occurs.
ensureOpenback to summary
private void ensureOpen() throws IOException

Throws IOException if the stream is closed (buf is null).

fillback to summary
private void fill() throws IOException

Fills the buffer with more data, taking into account shuffling and other tricks for dealing with marks. Assumes that it is being called by a synchronized method. This method also assumes that all data has already been read in, hence pos > count.

getBufIfOpenback to summary
private byte[] getBufIfOpen(boolean allocateIfEmpty) throws IOException

Returns the internal buffer, optionally allocating it if empty.

Parameters
allocateIfEmpty:boolean

true to allocate if empty

Exceptions
IOException:
if the stream is closed (buf is null)
getBufIfOpenback to summary
private byte[] getBufIfOpen() throws IOException

Returns the internal buffer, allocating it if empty.

Exceptions
IOException:
if the stream is closed (buf is null)
getInIfOpenback to summary
private InputStream getInIfOpen() throws IOException

Check to make sure that underlying input stream has not been nulled out due to close; if not return it;

isTrustedback to summary
private static boolean isTrusted(OutputStream os)

Returns true if this class satisfies the following conditions:

  • does not retain a reference to the byte[]
  • does not leak a reference to the byte[] to non-trusted classes
  • does not modify the contents of the byte[]
  • write() method does not read the contents outside of the offset/length bounds
Returns:boolean

true if this class is trusted

markback to summary
public synchronized void mark(int readlimit)

Overrides java.io.FilterInputStream.mark.

See the general contract of the mark method of InputStream.

Parameters
readlimit:int

the maximum limit of bytes that can be read before the mark position becomes invalid.

See Also
java.io.BufferedInputStream#reset()
markSupportedback to summary
public boolean markSupported()

Overrides java.io.FilterInputStream.markSupported.

Tests if this input stream supports the mark and reset methods. The markSupported method of BufferedInputStream returns true.

Returns:boolean

a boolean indicating if this stream type supports the mark and reset methods.

See Also
java.io.InputStream#mark(int), java.io.InputStream#reset()
readback to summary
public synchronized int read() throws IOException

Overrides java.io.FilterInputStream.read.

See the general contract of the read method of InputStream.

Returns:int

the next byte of data, or -1 if the end of the stream is reached.

Exceptions
IOException:
if this input stream has been closed by invoking its close() method, or an I/O error occurs.
See Also
java.io.FilterInputStream#in
readback to summary
public synchronized int read(byte[] b, int off, int len) throws IOException

Overrides java.io.FilterInputStream.read.

Reads bytes from this byte-input stream into the specified byte array, starting at the given offset.

This method implements the general contract of the corresponding read method of the InputStream class. As an additional convenience, it attempts to read as many bytes as possible by repeatedly invoking the read method of the underlying stream. This iterated read continues until one of the following conditions becomes true:

  • The specified number of bytes have been read,
  • The read method of the underlying stream returns -1, indicating end-of-file, or
  • The available method of the underlying stream returns zero, indicating that further input requests would block.
If the first read on the underlying stream returns -1 to indicate end-of-file then this method returns -1. Otherwise, this method returns the number of bytes actually read.

Subclasses of this class are encouraged, but not required, to attempt to read as many bytes as possible in the same fashion.

Parameters
b:byte[]

destination buffer.

off:int

offset at which to start storing bytes.

len:int

maximum number of bytes to read.

Returns:int

the number of bytes read, or -1 if the end of the stream has been reached.

Exceptions
IOException:
if this input stream has been closed by invoking its close() method, or an I/O error occurs.
IndexOutOfBoundsException:
If off is negative, len is negative, or len is greater than b.length - off
read1back to summary
private int read1(byte[] b, int off, int len) throws IOException

Read bytes into a portion of an array, reading from the underlying stream at most once if necessary.

resetback to summary
public synchronized void reset() throws IOException

Overrides java.io.FilterInputStream.reset.

See the general contract of the reset method of InputStream.

If markpos is -1 (no mark has been set or the mark has been invalidated), an IOException is thrown. Otherwise, pos is set equal to markpos.

Exceptions
IOException:
if this stream has not been marked or, if the mark has been invalidated, or the stream has been closed by invoking its close() method, or an I/O error occurs.
See Also
java.io.BufferedInputStream#mark(int)
skipback to summary
public synchronized long skip(long n) throws IOException

Overrides java.io.FilterInputStream.skip.

See the general contract of the skip method of InputStream.

Exceptions
IOException:
if this input stream has been closed by invoking its close() method, in.skip(n) throws an IOException, or an I/O error occurs.
transferToback to summary
public synchronized long transferTo(OutputStream out) throws IOException

Overrides java.io.InputStream.transferTo.

Doc from java.io.InputStream.transferTo.

Reads all bytes from this input stream and writes the bytes to the given output stream in the order that they are read. On return, this input stream will be at end of stream. This method does not close either stream.

This method may block indefinitely reading from the input stream, or writing to the output stream. The behavior for the case where the input and/or output stream is asynchronously closed, or the thread interrupted during the transfer, is highly input and output stream specific, and therefore not specified.

If the total number of bytes transferred is greater than Long#MAX_VALUE, then Long.MAX_VALUE will be returned.

If an I/O error occurs reading from the input stream or writing to the output stream, then it may do so after some bytes have been read or written. Consequently the input stream may not be at end of stream and one, or both, streams may be in an inconsistent state. It is strongly recommended that both streams be promptly closed if an I/O error occurs.

Annotations
@Override
Exceptions
IOException:
if an I/O error occurs when reading or writing