FileDocCategorySizeDatePackage
InputStream.javaAPI DocAndroid 1.5 API9343Wed May 06 22:41:04 BST 2009java.io

InputStream

public abstract class InputStream extends Object implements Closeable
The base class for all input streams. An input stream is a means of reading data from a source in a byte-wise manner.

Some input streams also support marking a position in the input stream and returning to this position later. This abstract class does not provide a fully working implementation, so it needs to be subclassed, and at least the {@link #read()} method needs to be overridden. Overriding some of the non-abstract methods is also often advised, since it might result in higher efficiency.

Many specialized input streams for purposes like reading from a file already exist in this package.

see
OutputStream
since
Android 1.0

Fields Summary
private static byte[]
skipBuf
Constructors Summary
public InputStream()
This constructor does nothing. It is provided for signature compatibility.

since
Android 1.0

        /* empty */
    
Methods Summary
public intavailable()
Returns the number of bytes that are available before this stream will block. This implementation always returns 0. Subclasses should override and indicate the correct number of bytes available.

return
the number of bytes available before blocking.
throws
IOException if an error occurs in this stream.
since
Android 1.0

        return 0;
    
public voidclose()
Closes this stream. Concrete implementations of this class should free any resources during close. This implementation does nothing.

throws
IOException if an error occurs while closing this stream.
since
Android 1.0

        /* empty */
    
public voidmark(int readlimit)
Sets a mark position in this InputStream. The parameter {@code readlimit} indicates how many bytes can be read before the mark is invalidated. Sending {@code reset()} will reposition the stream back to the marked position provided {@code readLimit} has not been surpassed.

This default implementation does nothing and concrete subclasses must provide their own implementation.

param
readlimit the number of bytes that can be read from this stream before the mark is invalidated.
see
#markSupported()
see
#reset()
since
Android 1.0

        /* empty */
    
public booleanmarkSupported()
Indicates whether this stream supports the {@code mark()} and {@code reset()} methods. The default implementation returns {@code false}.

return
always {@code false}.
see
#mark(int)
see
#reset()
since
Android 1.0

        return false;
    
public abstract intread()
Reads a single byte from this stream and returns it as an integer in the range from 0 to 255. Returns -1 if the end of the stream has been reached. Blocks until one byte has been read, the end of the source stream is detected or an exception is thrown.

return
the byte read or -1 if the end of stream has been reached.
throws
IOException if the stream is closed or another IOException occurs.
since
Android 1.0

public intread(byte[] b)
Reads bytes from this stream and stores them in the byte array {@code b}.

param
b the byte array in which to store the bytes read.
return
the number of bytes actually read or -1 if the end of the stream has been reached.
throws
IOException if this stream is closed or another IOException occurs.
since
Android 1.0

        // BEGIN android-note
        // changed array notation to be consistent with the rest of harmony
        // END android-note
        return read(b, 0, b.length);
    
public intread(byte[] b, int offset, int length)
Reads at most {@code length} bytes from this stream and stores them in the byte array {@code b} starting at {@code offset}.

param
b the byte array in which to store the bytes read.
param
offset the initial position in {@code buffer} to store the bytes read from this stream.
param
length the maximum number of bytes to store in {@code b}.
return
the number of bytes actually read or -1 if the end of the stream has been reached.
throws
IndexOutOfBoundsException if {@code offset < 0} or {@code length < 0}, or if {@code offset + length} is greater than the length of {@code b}.
throws
IOException if the stream is closed or another IOException occurs.
since
Android 1.0

        // BEGIN android-note
        // changed array notation to be consistent with the rest of harmony
        // END android-note
        // avoid int overflow, check null b
        // BEGIN android-changed
        // Exception priorities (in case of multiple errors) differ from
        // RI, but are spec-compliant.
        // removed redundant check, made implicit null check explicit,
        // used (offset | length) < 0 instead of (offset < 0) || (length < 0)
        // to safe one operation
        if (b == null) {
            throw new NullPointerException(Msg.getString("K0047")); //$NON-NLS-1$
        }
        if ((offset | length) < 0 || length > b.length - offset) {
            throw new ArrayIndexOutOfBoundsException(Msg.getString("K002f")); //$NON-NLS-1$
        }
        // END android-changed
        for (int i = 0; i < length; i++) {
            int c;
            try {
                if ((c = read()) == -1) {
                    return i == 0 ? -1 : i;
                }
            } catch (IOException e) {
                if (i != 0) {
                    return i;
                }
                throw e;
            }
            b[offset + i] = (byte)c;
        }
        return length;
    
public synchronized voidreset()
Resets this stream to the last marked location. Throws an {@code IOException} if the number of bytes read since the mark has been set is greater than the limit provided to {@code mark}, or if no mark has been set.

This implementation always throws an {@code IOException} and concrete subclasses should provide the proper implementation.

throws
IOException if this stream is closed or another IOException occurs.
since
Android 1.0

        throw new IOException();
    
public longskip(long n)
Skips at most {@code n} bytes in this stream. It does nothing and returns 0 if {@code n} is negative. Less than {@code n} characters are skipped if the end of this stream is reached before the operation completes.

This default implementation reads {@code n} bytes into a temporary buffer. Concrete subclasses should provide their own implementation.

param
n the number of bytes to skip.
return
the number of bytes actually skipped.
throws
IOException if this stream is closed or another IOException occurs.
since
Android 1.0

        if (n <= 0) {
            return 0;
        }
        long skipped = 0;
        int toRead = n < 4096 ? (int) n : 4096;
        if (skipBuf == null || skipBuf.length < toRead) {
            skipBuf = new byte[toRead];
        }
        while (skipped < n) {
            int read = read(skipBuf, 0, toRead);
            if (read == -1) {
                return skipped;
            }
            skipped += read;
            if (read < toRead) {
                return skipped;
            }
            if (n - skipped < toRead) {
                toRead = (int) (n - skipped);
            }
        }
        return skipped;