文档章节

【Java部分源码分析之io篇】1.InputStream

gongwilliam
 gongwilliam
发布于 2017/07/26 15:56
字数 513
阅读 10
收藏 0

InputStream是所有字节流输入的父类,它是个抽象类。它的内容比较少,也比较简单。它有一个成员变量MAX_SKIP_BUFFER_SIZE。

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

这个成员变量的作用是用于确定在skip方法中使用的最大缓存数组大小。

    public abstract int read() throws IOException;

这个方式是个抽象方法,在这里没有具体实现,它的作用是从输入流中读取一个字节数据,如果没有读取到数据则返回-1,否则返回的数据在0-255之间。

    public int read(byte b[]) throws IOException { 
        return read(b, 0, b.length);
    }
    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;
    }

这是两个重载方法,主要的作用是把读取的数据存储在b数组内。

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

skip方法主要是让输入流往前跳n个字节,这个放会用到上面说的成员变量MAX_SKIP_BUFFER_SIZE,假如n大于MAX_SKIP_BUFFER_SIZE,则只跳MAX_SKIP_BUFFER_SIZE这么大的字节数,也就是最大只跳MAX_SKIP_BUFFER_SIZE个字节数。它的返回值是跳的字节数。

    public void close() throws IOException {}

close方法应该是用得最多的方法,主要是用来关闭输入流,释放系统资源。

    public synchronized void mark(int readlimit) {}
    public synchronized void reset() throws IOException {
        throw new IOException("mark/reset not supported");
    }

上面两个方法是比较少用,mark的作用用来标记输入流的一个位置,这样调用reset之后,输入流就能再次回到标记的位置,readlimit代表只能从输入流读取的数目。

© 著作权归作者所有

gongwilliam
粉丝 2
博文 14
码字总数 12127
作品 0
深圳
私信 提问
泥沙砖瓦浆木匠/java-core-learning-example

感谢赞助的ta们 Java 核心系列教程,关于Java核心技术学习积累的例子,是初学者及核心技术巩固的最佳实践。 包括基础语法,OOP,字符串,集合,IO,反射,线程,网络等。 未完成模块:阿里J...

泥沙砖瓦浆木匠
04/02
0
0
【目录导航】JAVA零基础进阶之路

【JAVA零基础入门系列】(已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day6 Java字符串 Day7 Java输入与输出...

MFrank
2018/06/21
0
0
Java 208 道面试题:Java 基础模块答案

目前市面上的面试题存在两大问题:第一,题目太旧好久没有更新了,还都停留在 2010 年之前的状态;第二,近几年 JDK 更新和发布都很快,Java 的用法也变了不少,加上 Java 技术栈也加入了很多...

王磊的博客
03/05
425
0
在Android Studio中编译谷歌自带输入法

介绍 近期开始做输入法的项目,所以必须要解决一些工程问题,在此记录下 第一篇先介绍编译篇,后续会增加java代码和native的代码分析篇 开始动手 首先,从谷歌的AOSP(Android Open Source Pr...

小包July
2016/12/03
0
0
Java NIO原理 图文分析及代码实现

Java NIO原理图文分析及代码实现 前言: 最近在分析hadoop的RPC(Remote Procedure Call Protocol ,远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术...

囚兔
2015/04/29
283
1

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
今天
5
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
今天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
今天
4
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
今天
7
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部