public abstract class InputStream extends Object implements Closeable
Most clients will use input streams that read data from the file system
(FileInputStream), the network (Socket.getInputStream()/URLConnection.getInputStream()), or from an in-memory byte
array (ByteArrayInputStream).
Use InputStreamReader to adapt a byte stream like this one into a
character stream.
Most clients should wrap their input stream with BufferedInputStream. Callers that do only bulk reads may omit buffering.
Some implementations support marking a position in the input stream and
resetting back to this position later. Implementations that don't return
false from markSupported() and throw an IOException when
reset() is called.
FilterInputStream, which delegates all calls to the source input
stream.
All input stream subclasses should override both read() and read(byte[],int,int). The
three argument overload is necessary for bulk access to the data. This is
much more efficient than byte-by-byte access.
OutputStream| Constructor and Description |
|---|
InputStream()
This constructor does nothing.
|
| Modifier and Type | Method and Description |
|---|---|
int |
available()
Returns an estimated number of bytes that can be read or skipped without blocking for more
input.
|
void |
close()
Closes this stream.
|
void |
mark(int readlimit)
Sets a mark position in this InputStream.
|
boolean |
markSupported()
Indicates whether this stream supports the
mark() and
reset() methods. |
static InputStream |
nullInputStream()
Returns a new
InputStream that reads no bytes. |
abstract int |
read()
Reads a single byte from this stream and returns it as an integer in the
range from 0 to 255.
|
int |
read(byte[] buffer)
Equivalent to
read(buffer, 0, buffer.length). |
int |
read(byte[] buffer,
int byteOffset,
int byteCount)
Reads up to
byteCount bytes from this stream and stores them in
the byte array buffer starting at byteOffset. |
byte[] |
readAllBytes()
Reads all remaining bytes from the input stream.
|
int |
readNBytes(byte[] b,
int off,
int len)
Reads the requested number of bytes from the input stream into the given
byte array.
|
byte[] |
readNBytes(int len)
Reads up to a specified number of bytes from the input stream.
|
void |
reset()
Resets this stream to the last marked location.
|
long |
skip(long byteCount)
Skips at most
byteCount bytes in this stream. |
long |
transferTo(OutputStream out)
Reads all bytes from this input stream and writes the bytes to the
given output stream in the order that they are read.
|
public InputStream()
public static InputStream nullInputStream()
InputStream that reads no bytes. The returned
stream is initially open. The stream is closed by calling the
close() method. Subsequent calls to close() have no
effect.
While the stream is open, the available(), read(),
read(byte[]), read(byte[], int, int),
readAllBytes(), readNBytes(byte[], int, int),
readNBytes(int), skip(long), and
transferTo() methods all behave as if end of stream has been
reached. After the stream has been closed, these methods all throw
IOException.
The markSupported() method returns false. The
mark() method does nothing, and the reset() method
throws IOException.
InputStream which contains no bytespublic int available()
throws IOException
Note that this method provides such a weak guarantee that it is not very useful in practice.
Firstly, the guarantee is "without blocking for more input" rather than "without blocking": a read may still block waiting for I/O to complete — the guarantee is merely that it won't have to wait indefinitely for data to be written. The result of this method should not be used as a license to do I/O on a thread that shouldn't be blocked.
Secondly, the result is a conservative estimate and may be significantly smaller than the actual number of bytes available. In particular, an implementation that always returns 0 would be correct. In general, callers should only use this method if they'd be satisfied with treating the result as a boolean yes or no answer to the question "is there definitely data ready?".
Thirdly, the fact that a given number of bytes is "available" does not guarantee that a read or skip will actually read or skip that many bytes: they may read or skip fewer.
It is particularly important to realize that you must not use this method to
size a container and assume that you can read the entirety of the stream without needing
to resize the container. Such callers should probably write everything they read to a
ByteArrayOutputStream and convert that to a byte array. Alternatively, if you're
reading from a file, File.length() returns the current length of the file (though
assuming the file's length can't change may be incorrect, reading a file is inherently
racy).
The default implementation of this method in InputStream always returns 0.
Subclasses should override this method if they are able to indicate the number of bytes
available.
IOException - if this stream is closed or an error occurspublic void close()
throws IOException
close in interface Closeableclose in interface AutoCloseableIOException - if an error occurs while closing this stream.public void mark(int readlimit)
readlimit
indicates how many bytes can be read before the mark is invalidated.
Sending reset() will reposition the stream back to the marked
position provided readLimit has not been surpassed.
This default implementation does nothing and concrete subclasses must provide their own implementation.
readlimit - the number of bytes that can be read from this stream before
the mark is invalidated.markSupported(),
reset()public boolean markSupported()
mark() and
reset() methods. The default implementation returns false.public abstract int read()
throws IOException
IOException - if the stream is closed or another IOException occurs.public int read(byte[] buffer)
throws IOException
read(buffer, 0, buffer.length).IOExceptionpublic int read(byte[] buffer,
int byteOffset,
int byteCount)
throws IOException
byteCount bytes from this stream and stores them in
the byte array buffer starting at byteOffset.
Returns the number of bytes actually read or -1 if the end of the stream
has been reached.IndexOutOfBoundsException - if byteOffset < 0 || byteCount < 0 || byteOffset + byteCount > buffer.length.IOException - if the stream is closed or another IOException occurs.public byte[] readAllBytes()
throws IOException
When this stream reaches end of stream, further invocations of this method will return an empty byte array.
Note that this method is intended for simple cases where it is convenient to read all bytes into a byte array. It is not intended for reading input streams with large amounts of data.
The behavior for the case where the input stream is asynchronously closed, or the thread interrupted during the read, is highly input stream specific, and therefore not specified.
If an I/O error occurs reading from the input stream, then it may do so after some, but not all, bytes have been read. Consequently the input stream may not be at end of stream and may be in an inconsistent state. It is strongly recommended that the stream be promptly closed if an I/O error occurs.
IOException - if an I/O error occursOutOfMemoryError - if an array of the required size cannot be
allocated.public byte[] readNBytes(int len)
throws IOException
The length of the returned array equals the number of bytes read
from the stream. If len is zero, then no bytes are read and
an empty byte array is returned. Otherwise, up to len bytes
are read from the stream. Fewer than len bytes may be read if
end of stream is encountered.
When this stream reaches end of stream, further invocations of this method will return an empty byte array.
Note that this method is intended for simple cases where it is
convenient to read the specified number of bytes into a byte array. The
total amount of memory allocated by this method is proportional to the
number of bytes read from the stream which is bounded by len.
Therefore, the method may be safely called with very large values of
len provided sufficient memory is available.
The behavior for the case where the input stream is asynchronously closed, or the thread interrupted during the read, is highly input stream specific, and therefore not specified.
If an I/O error occurs reading from the input stream, then it may do so after some, but not all, bytes have been read. Consequently the input stream may not be at end of stream and may be in an inconsistent state. It is strongly recommended that the stream be promptly closed if an I/O error occurs.
len - the maximum number of bytes to readIllegalArgumentException - if length is negativeIOException - if an I/O error occursOutOfMemoryError - if an array of the required size cannot be
allocated.public int readNBytes(byte[] b,
int off,
int len)
throws IOException
len bytes of input data have
been read, end of stream is detected, or an exception is thrown. The
number of bytes actually read, possibly zero, is returned. This method
does not close the input stream.
In the case where end of stream is reached before len bytes
have been read, then the actual number of bytes read will be returned.
When this stream reaches end of stream, further invocations of this
method will return zero.
If len is zero, then no bytes are read and 0 is
returned; otherwise, there is an attempt to read up to len bytes.
The first byte read is stored into element b[off], the next
one in to b[off+1], and so on. The number of bytes read is, at
most, equal to len. Let k be the number of bytes actually
read; these bytes will be stored in elements b[off] through
b[off+k-1], leaving elements b[off+k
] through b[off+len-1] unaffected.
The behavior for the case where the input stream is asynchronously closed, or the thread interrupted during the read, is highly input stream specific, and therefore not specified.
If an I/O error occurs reading from the input stream, then it may do
so after some, but not all, bytes of b have been updated with
data from the input stream. Consequently the input stream and b
may be in an inconsistent state. It is strongly recommended that the
stream be promptly closed if an I/O error occurs.
b - the byte array into which the data is readoff - the start offset in b at which the data is writtenlen - the maximum number of bytes to readIOException - if an I/O error occursNullPointerException - if b is nullIndexOutOfBoundsException - If off is negative, len
is negative, or len is greater than b.length - offpublic void reset()
throws IOException
IOException if the number of bytes read since the mark has been
set is greater than the limit provided to mark, or if no mark
has been set.
This implementation always throws an IOException and concrete
subclasses should provide the proper implementation.
IOException - if this stream is closed or another IOException occurs.public long skip(long byteCount)
throws IOException
byteCount bytes in this stream. The number of actual
bytes skipped may be anywhere between 0 and byteCount. If
byteCount is negative, this method does nothing and returns 0, but
some subclasses may throw.
Note the "at most" in the description of this method: this method may choose to skip fewer bytes than requested. Callers should always check the return value.
This default implementation reads bytes into a temporary buffer. Concrete subclasses should provide their own implementation.
IOException - if this stream is closed or another IOException
occurs.public long transferTo(OutputStream out) throws IOException
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 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.
out - the output stream, non-nullIOException - if an I/O error occurs when reading or writingNullPointerException - if out is null