Java-IO之超类InputStream

时间:2022-09-20 15:41:56

InputStream是以字节为单位的输出流,通过以下框架图可以看到InputStream是所有以字节输入流类的公共父类:

Java-IO之超类InputStream

基于JDK8的InputStream类源码:

public abstract class InputStream implements Closeable {

    //最大跳过的缓冲区大小
    private static final int MAX_SKIP_BUFFER_SIZE = 2048;
    //从输入的流中读取下一个字节
    public abstract int read() throws IOException;
    //从输入流中读取一定大小的字节,没有数据返回-1
    public int read(byte b[]) throws IOException {
        return read(b, 0, b.length);
    }
    //从输人流中读取的数据放到b数组中起始位置为off,长度为len
    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();
        } else if (len == 0) {
            return 0;
        }

        int c = read();
        if (c == -1) {
            return -1;
        }
        b[off] = (byte)c;

        int i = 1;
        try {
            for (; i < len ; i++) {
                c = read();
                if (c == -1) {
                    break;
                }
                b[off + i] = (byte)c;
            }
        } catch (IOException ee) {
        }
            return i;
        }

        //跳过输入流的长度为n字节
        public long skip(long n) throws IOException {

            long remaining = n;
            int nr;

            if (n <= 0) {
                return 0;
            }

            int size = (int)Math.min(MAX_SKIP_BUFFER_SIZE, remaining);
            byte[] skipBuffer = new byte[size];
            while (remaining > 0) {
                nr = read(skipBuffer, 0, (int)Math.min(size, remaining));
                if (nr < 0) {
                    break;
                }
                remaining -= nr;
            }

        return n - remaining;
        }
    //返回从输入流中可以读取的数据
    public int available() throws IOException {
        return 0;
    }
    //关闭输入流,释放任何与这个流有关的资源
    public void close() throws IOException {}
        //标记在这个输入流的当前位置
    public synchronized void mark(int readlimit) {}
        //返回到最近标记的位置
    public synchronized void reset() throws IOException {
        throw new IOException("mark/reset not supported");
    }
    //测试这个输入流是否支持标记或者重置方法
    public boolean markSupported() {
        return false;
    }

}