资讯专栏INFORMATION COLUMN

JAVA IO源码学习系列一(InputStream)

mtunique / 3373人阅读

摘要:关闭此输入流并释放与该流关联的所有系统资源。在此输入流中标记当前的位置。将此流重新定位到最后一次对此输入流调用方法时的位置。

JAVA IO源码学习系列一(InputStream)

## 1.字节输入流源码InputStream介绍##

InpuSteam是字节输入流操作的超类(抽象类),定义了基本的一些操作方法,流的操作大概四部分:(1)构造数据流(来源);(2)读取流;(3)读取流则需要判断是否可读;(4):操作结束要记得关闭;所以主要关注的方法:构造函数(构造数据),available()判断当前数据是否还能继续读取,read()读取数据,close()结束之后一定关闭相关资源;下面是具体的源码:

public abstract class InputStream implements Closeable {

    //默认可以跳过的最大范围
    private static final int MAX_SKIP_BUFFER_SIZE = 2048;

    //读取字节流(子类具体实现)
    public abstract int read() throws IOException;

    //将字节流写入具体的字节数组b[]
    public int read(byte b[]) throws IOException {
        return read(b, 0, b.length);
    }

    //将字节流写入具体的字节数组b[],从指定的位置读off,和读具体的大小len
    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;
    }
    //  跳过和丢弃此输入流中数据的 n 个字节。
    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) {}

    将此流重新定位到最后一次对此输入流调用 mark 方法时的位置。
    public synchronized void reset() throws IOException {
        throw new IOException("mark/reset not supported");
    }
    测试此输入流是否支持 mark 和 reset 方法。
    public boolean markSupported() {
        return false;
    }

InputSteam主要抽象了一般的方法,具体实现通过不同的子类,在此就不多做介绍;
神兽出发:

/**
 *      ┌─┐       ┌─┐ + +
 *   ┌──┘ ┴───────┘ ┴──┐++
 *   │                 │
 *   │       ───       │++ + + +
 *   ███████───███████ │+
 *   │                 │+
 *   │       ─┴─       │
 *   │                 │
 *   └───┐         ┌───┘
 *       │         │
 *       │         │   + +
 *       │         │
 *       │         └──────────────┐
 *       │                        │
 *       │                        ├─┐
 *       │                        ┌─┘
 *       │                        │
 *       └─┐  ┐  ┌───────┬──┐  ┌──┘  + + + +
 *         │ ─┤ ─┤       │ ─┤ ─┤
 *         └──┴──┘       └──┴──┘  + + + +
 *                神兽保佑
 *               代码无BUG!
 */

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68010.html

相关文章

  • JAVA IO源码学习系列(FilterInpuStream 和FilterOutputStrea

    摘要:源码内容过滤输出流的父类,继承自类似类本身只是简单地重写那些将所有请求传递给所包含输出流的的所有方法。的子类可进一步地重写这些方法中的一些方法,并且还可以提供一些额外的方法和字段。 介绍 根据名称就可以了解到过滤输入输出流是做什么用的,过滤,过滤是为了干嘛呢?前面我们介绍过了字节数组输入输出流,对于字节数组输入输出流,只提供了一些必要的读取, 写入标记等方法或功能,这些是最基础的,那么...

    Flink_China 评论0 收藏0
  • JAVA IO源码学习系列(OutputStream)

    摘要:将指定数组中从偏移量开始的个字节写入此输出流。刷新此输出流并强制写出所有缓冲的输出字节关闭此输出流并释放与此流有关的所有系统资源。内容不多,召唤神兽 介绍 1. 输出流:OutputStream 之前的文章中介绍过了输入流的超类InputStream,这篇文章也简单的介绍一下与输入流相对的输出流;输入流我们之前说过,是将磁盘,文件,或者网络中的数据读取出来,(比如字节数组输入流将数据放...

    objc94 评论0 收藏0
  • 我的阿里之路+Java面经考点

    摘要:我的是忙碌的一年,从年初备战实习春招,年三十都在死磕源码,三月份经历了阿里五次面试,四月顺利收到实习。因为我心理很清楚,我的目标是阿里。所以在收到阿里之后的那晚,我重新规划了接下来的学习计划,将我的短期目标更新成拿下阿里转正。 我的2017是忙碌的一年,从年初备战实习春招,年三十都在死磕JDK源码,三月份经历了阿里五次面试,四月顺利收到实习offer。然后五月怀着忐忑的心情开始了蚂蚁金...

    姘搁『 评论0 收藏0
  • SpringBoot文件上传异常之temporary upload location not val

    摘要:原文一灰灰之系列教程文件上传异常原理分析搭建的应用,一直工作得好好的,突然发现上传文件失败,提示目录非法,实际查看目录,结果还真没有,下面就这个问题的表现,分析下针对文件上传的处理过程问题分析堆栈分析问题定位,最佳的辅助手段就是堆栈 原文: 一灰灰Blog之Spring系列教程文件上传异常原理分析 SpringBoot搭建的应用,一直工作得好好的,突然发现上传文件失败,提示org.s...

    klinson 评论0 收藏0
  • 高薪程序员&amp;面试题精讲系列22之说说JavaIO流,常用哪些IO流?

    摘要:一面试题及剖析今日面试题今天壹哥带各位复习一块可能会令初学者比较头疼的内容,起码当时让我很有些头疼的内容,那就是流。在这里壹哥会从两部分展开介绍流,即与流。除此之外尽量使用字节流。关闭此输入流并释放与流相关联的任何系统资源。 一. 面试题及剖析 1. 今日面试题 今天 壹哥 带各位复习一块可...

    fnngj 评论0 收藏0

发表评论

0条评论

mtunique

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<