FilterInputStream的作用是用来封装其他的输入流,并为它们提供了额外的功能,它的常用的子类有BufferedInputStream和DataInputStream。FilterOutputStream的作用是用来封装其他的输出流,并为它们提供额外的功能,主要包括BufferedOutputStream,DataOutputStream和PrintStream。

基于JDK8的FilterInputStream的源码:
public class FilterInputStream extends InputStream {
    /**
     * The input stream to be filtered.
     */
    //InputStream
    protected volatile InputStream in;

    /**
     * Creates a <code>FilterInputStream</code>
     * by assigning the  argument <code>in</code>
     * to the field <code>this.in</code> so as
     * to remember it for later use.
     *
     * @param   in   the underlying input stream, or <code>null</code> if
     *          this instance is to be created without an underlying stream.
     */

    protected FilterInputStream(InputStream in) {
        this.in = in;
    }
    //从输入流读取下一个字节
    public int read() throws IOException {
        return in.read();
    }
    //从输入流中读取len长度的字节
    public int read(byte b[]) throws IOException {
        return read(b, 0, b.length);
    }
    public int read(byte b[], int off, int len) throws IOException {
        return in.read(b, off, len);
    }
    //跳过长度
    public long skip(long n) throws IOException {
        return in.skip(n);
    }
    //是否还有数据
    public int available() throws IOException {
        return in.available();
    }
    //关闭资源
    public void close() throws IOException {
        in.close();
    }
    //标记在输入流的当前位置
    public synchronized void mark(int readlimit) {
        in.mark(readlimit);
    }
    //重置上次位置
    public synchronized void reset() throws IOException {
        in.reset();
    }
    //判断是否支持重置和标记
    public boolean markSupported() {
        return in.markSupported();
    }
}

基于JDK8的FilterOutputStream源码:

public class FilterOutputStream extends OutputStream {
    /**
     * The underlying output stream to be filtered.
     */
    protected OutputStream out;

    public FilterOutputStream(OutputStream out) {
        this.out = out;
    }
    //写到输入流中
    public void write(int b) throws IOException {
        out.write(b);
    }
    //写b到输入流中
    public void write(byte b[]) throws IOException {
        write(b, 0, b.length);
    }
    //写b中的起始位置为off,长度为len
    public void write(byte b[], int off, int len) throws IOException {
        if ((off | len | (b.length - (len + off)) | (off + len)) < 0)
            throw new IndexOutOfBoundsException();

        for (int i = 0 ; i < len ; i++) {
            write(b[off + i]);
        }
    }

    /**
     * Flushes this output stream and forces any buffered output bytes
     * to be written out to the stream.
     * <p>
     * The <code>flush</code> method of <code>FilterOutputStream</code>
     * calls the <code>flush</code> method of its underlying output stream.
     *
     * @exception  IOException  if an I/O error occurs.
     * @see        java.io.FilterOutputStream#out
     */
    //刷新,强制所有的缓冲数据都被写出
    public void flush() throws IOException {
        out.flush();
    }
    //关闭资源
    @SuppressWarnings("try")
    public void close() throws IOException {
        try (OutputStream ostream = out) {
            flush();
        }
    }
}
04-28 22:09