zoukankan      html  css  js  c++  java
  • Java IO(二) 之 InputStream

    源代码均以JDK1.8作为參考

    前言:
    InputStream实现了两个接口Closeable和AutoCloseable:
    这里写图片描写叙述
    Closeable:JDK1.5中引入,Closeable接口中仅仅有一个close()方法的定义:
    public void close() throws IOException;
    实现了Closeable接口的类的对象能够被关闭,流类都实现了该接口,以达到关闭流的目的。


    AutoCloseable:JDK1.7中引入,为JDK1.7中引入的带资源的try语句提供了支持。try能够自己主动关闭资源。

    AutoCloseable接口亦仅仅定义了一个close()方法的定义:
    void close() throws Exception;
    仅仅有实现了AutoCloseable接口的类的对象才干够使用带资源的try语句进行管理。在JDK1.7中Closeable继承了AutoCloseable接口,所以IO包下的流类都能够使用带资源的try语句进行管理。

    源代码分析:
    InputStream是相对于Java本身来说的,从其它途径向内读取数据,所以叫输入流。

    InputStream是一个抽象类。是java.io流字节流的基类。


    InputStream中定义了一系列方法。
    主要方法:
    1.public abstract int read():
    从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。假设由于已经到达流末尾而没有可用的字节。则返回值 -1。

    在输入数据可用、检測到流末尾或者抛出异常前。此方法一直堵塞。
    子类必须提供此方法的一个实现。
    2.public int read(byte b[]):
    从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。
    3.public int read(byte b[], int off, int len):
    将输入流中最多 len 个数据字节读入 byte(从byte数组的off索引開始读入) 数组。

    尝试读取 len 个字节,但读取的字节也可能小于该值。

    以整数形式返回实际读取的字节数。
    注:对于InputStream中的2和3方法,事实上现都是依赖1方法来实现的,通过1方法获取单个字节,读入2和3中指定的缓冲数组中。


    4. public long skip(long n):
    在输入流中跳过指定字节数的读取。跳过的字节数为n,可是InputStream定义了skip的最大长度MAX_SKIP_BUFFER_SIZE=2048,n超过这个值。将仅仅跳过MAX_SKIP_BUFFER_SIZE个字节的读取。源代码例如以下:

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

    相同基于read系列重载方法实现,原理就是直接讲指定个数的字节读取。可是不进行保留,以完毕skip操作。
    5. public int available():
    返回该InputStream在不被堵塞的情况下下一次能够读到的数据长度。
    6. public void close():
    关闭InputStream流
    7. public synchronized void mark(int readlimit):
    标记InputStream流中的某一个位置,由其子类进行详细实现。
    8. public synchronized void reset():
    将此流又一次定位到最后一次对此输入流调用 mark 方法时的位置。
    9. public boolean markSupported():
    检查此流是否支持详细实现了public synchronized void mark(int readlimit)方法。

    总: InputStream在一定程度上对输入流做了一个抽象。定义了输入流的基本职责,可是并不提供详细的实现。仅仅是做简单的约束。并不是强制重写,由于InputStream是abstract修饰的,所以其并不具有实例化的能力,要全然借助于其子类实现对于流的各种操作。

  • 相关阅读:
    Hystrix服务降级
    postman使用教程12-预处理(pre-request) 发送请求
    postman使用教程11- sign 签名预处理(pre-request)
    postman使用教程10-请求前参数预处理(pre-request)
    postman使用教程9-点 code 按钮生成代码段
    postman使用教程8-设置断言(Tests脚本编写)
    postman使用教程7-参数化引用外部文件(txt/csv/json)测试数据
    postman使用教程6-引用随机变量($guid,$timestamp,$randomInt)
    postman使用教程5-Test脚本中自定义变量(参数关联 提取 token 和引用 token )
    postman使用教程4-集合变量(collection variables)的使用
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7049353.html
Copyright © 2011-2022 走看看