zoukankan      html  css  js  c++  java
  • 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 {

        }

    }

  • 相关阅读:
    NopCommerce代码结构
    至于你信不信,我反正是信了——以类为单位的编程思想
    男人的小金库藏在哪里?——公共数据集Model
    老婆使用说明书——注册系统的逻辑与结构
    ASP.NET学习参考站点
    学了N年英语,你学会翻译了吗?——最基本的数据库连接
    编程也讲禅,您读过《金刚经》吗?——ADO.NET核心类的灭度与SQLHelper的诞生——十八相送(上)
    文件夹病毒专杀工具
    不想当将军的学生,不是好程序员——数据访问层DAL——程序结构的思考
    html的标签一共有多少个?
  • 原文地址:https://www.cnblogs.com/shineyoung/p/11368828.html
Copyright © 2011-2022 走看看