Java io包 inputstream&outputstream

分析InputStream

/**

 * This abstract class is the superclass of all classes representing

 * an input stream of bytes.

 *

 * <p> Applications that need to define a subclass of <code>InputStream</code>

 * must always provide a method that returns the next byte of input.

 *

 * @author  Arthur van Hoff

 * @see     java.io.BufferedInputStream

 * @see     java.io.ByteArrayInputStream

 * @see     java.io.DataInputStream

 * @see     java.io.FilterInputStream

 * @see     java.io.InputStream#read()

 * @see     java.io.OutputStream

 * @see     java.io.PushbackInputStream

 * @since   JDK1.0

 */

public abstract class InputStream implements Closeable {

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

   

    //抽象方法 从输入流读取一个字节交由子类实现

    public abstract int read() throws IOException;

    //从输入流读取字节流输出至byte b[]

    public int read(byte b[]) throws IOException {

        return read(b, 0, b.length);

    }

    //从输入流读取字节流输出至byte b[]

    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;

    }

    //跳过指定字节 实际上是读取指定字节 抛掉读取过的字节

    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;

    }

}

分析OutputStream

/**

 * This abstract class is the superclass of all classes representing

 * an output stream of bytes. An output stream accepts output bytes

 * and sends them to some sink.

 * <p>

 * Applications that need to define a subclass of

 * <code>OutputStream</code> must always provide at least a method

 * that writes one byte of output.

 *

 * @author  Arthur van Hoff

 * @see     java.io.BufferedOutputStream

 * @see     java.io.ByteArrayOutputStream

 * @see     java.io.DataOutputStream

 * @see     java.io.FilterOutputStream

 * @see     java.io.InputStream

 * @see     java.io.OutputStream#write(int)

 * @since   JDK1.0

 */

public abstract class OutputStream implements Closeable, Flushable {

   

//往输出流写一个字节

    public abstract void write(int b) throws IOException;

    /**

     * Writes <code>b.length</code> bytes from the specified byte array

     * to this output stream. The general contract for <code>write(b)</code>

     * is that it should have exactly the same effect as the call

     * <code>write(b, 0, b.length)</code>.

     *

     * @param      b   the data.

     * @exception  IOException  if an I/O error occurs.

     * @see        java.io.OutputStream#write(byte[], int, int)

     */

   

    //往输出流写指定字节数组

    public void write(byte b[]) throws IOException {

        write(b, 0, b.length);

    }

    //往输出流写指定字节数组

    public void write(byte b[], int off, int len) throws IOException {

        if (b == null) {

            throw new NullPointerException();

        } else if ((off < 0) || (off > b.length) || (len < 0) ||

                   ((off + len) > b.length) || ((off + len) < 0)) {

            throw new IndexOutOfBoundsException();

        } else if (len == 0) {

            return;

        }

        for (int i = 0 ; i < len ; i++) {

            write(b[off + i]);

        }

    }

   

    //立即将缓冲区数据刷新写入

    void flush() throws IOException {

    }

    //关闭输出流

    public void close() throws IOException {

    }

}

猜你喜欢

转载自www.cnblogs.com/shineyoung/p/11368828.html