【Java部分源码分析之io篇】1.InputStream

原创
2017/07/26 15:56
阅读数 12

InputStream是所有字节流输入的父类,它是个抽象类。它的内容比较少,也比较简单。它有一个成员变量MAX_SKIP_BUFFER_SIZE。

 // MAX_SKIP_BUFFER_SIZE is used to determine the maximum buffer size to
 // use when skipping.
 private static final int MAX_SKIP_BUFFER_SIZE = 2048;

这个成员变量的作用是用于确定在skip方法中使用的最大缓存数组大小。

    public abstract int read() throws IOException;

这个方式是个抽象方法,在这里没有具体实现,它的作用是从输入流中读取一个字节数据,如果没有读取到数据则返回-1,否则返回的数据在0-255之间。

    public int read(byte b[]) throws IOException { 
        return read(b, 0, b.length);
    }
    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;
    }

这是两个重载方法,主要的作用是把读取的数据存储在b数组内。

    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;
    }

skip方法主要是让输入流往前跳n个字节,这个放会用到上面说的成员变量MAX_SKIP_BUFFER_SIZE,假如n大于MAX_SKIP_BUFFER_SIZE,则只跳MAX_SKIP_BUFFER_SIZE这么大的字节数,也就是最大只跳MAX_SKIP_BUFFER_SIZE个字节数。它的返回值是跳的字节数。

    public void close() throws IOException {}

close方法应该是用得最多的方法,主要是用来关闭输入流,释放系统资源。

    public synchronized void mark(int readlimit) {}
    public synchronized void reset() throws IOException {
        throw new IOException("mark/reset not supported");
    }

上面两个方法是比较少用,mark的作用用来标记输入流的一个位置,这样调用reset之后,输入流就能再次回到标记的位置,readlimit代表只能从输入流读取的数目。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部