Java IO 之 InputStream源码
InputStream是一个抽象类,即表示所有字节输入流实现类的基类。它的作用就是抽象地表示所有从不同数据源产生输入的类,例如常见的FileInputStream、FilterInputStream等。那些数据源呢?比如:
1) 字节数组(不代表String类,但可以转换)
2) String对象
3) 文件
4) 一个其他种类的流组成的序列化 (在分布式系统中常见)
5) 管道(多线程环境中的数据源)
等等
二者,注意它是属于字节流部分,而不是字符流(java.io中Reader\Writer,下面会讲到)。
FilterInputStream是为各种InputStream实现类提供的“装饰器模式”的基类。因此,可以分为原始的字节流和“装饰”过的功能封装字节流。
二、细解InputStream源码的核心
源码如下:
抽象方法,没有具体实现。因为子类必须实现此方法的一个实现。这就是输入流的关键方法。
二者,可见下面两个read()方法都调用了这个方法子类的实现来完成功能的。
该方法是表示从输入流中读取数据的一定数量字节,并存储在缓存字节数组b。其效果等同于调用了下面方法的实现:
如果b的长度为 0,则不读取任何字节并返回 0;否则,尝试读取至少 1 字节。如果因为流位于文件末尾而没有可用的字节,则返回值 -1;否则,至少读取一个字节并将其存储在 b 中。
思考:这时候,怪不得很多时候, b != –1 或者 b != EOF
在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞。
该方法先进行校验,然后校验下个字节是否为空。如果校验通过后,
如下代码:
将读取的第一个字节存储在元素 b[off] 中,下一个存储在 b[off+1] 中,依次类推。读取的字节数最多等于 len。设 k 为实际读取的字节数;这些字节将存储在 b[off] 到 b[off+k-1] 的元素中,不影响 b[off+k] 到 b[off+len-1] 的元素。
因为有上面两个read的实现,所以这里InputStream设计为抽象类。
1. InputSream 对应着 OutputStream
2. 看源码是享受人家写代码中流露的How
二哥聊RPA 公号「二哥聊RPA」。关注我,一起洞察 RPA ◎ RPA创业者 ◎ 现明堂红木商业顾问,为十月结晶、可啦啦、鑫蜂维等多家企业提供 RPA 咨询服务 ◎ 希望帮助大家在 RPA 上做一些力所能及的事情
相关文章
- IDEA中快速获取Java源码中类、方法、属性的签名
- 图解 Java IO : 一、File源码
- Java IO 之 OutputStream源码
- Java反射异常:java.lang.NoSuchFieldException
- Java实现 LeetCode 816 模糊坐标(暴力)
- Java实现 LeetCode 746 使用最小花费爬楼梯(递推)
- Java实现 LeetCode 1013 将数组分成和相等的三个部分
- Java IO 之 InputStream源码
- 【JAVA】Java循环语句中的continue跳转进入下一次循环是否判断循环条件
- How to improve Java's I/O performance( 提升 java i/o 性能)
- 1小时学会通过Java Swing Design设计java图形化
- 【java】Java中-> 是什么意思?
- 【java】Java 枚举(enum)如何使用以及原理
- 【java】Java 包(package)
- 基于JAVA实现的WEB端UI自动化 - WebDriver框架篇 - ant使用 - ant发送邮件显示源码的解决方法
- 频繁IO导致---java.io.IOException: 设备上没有空间
- Java并发编程实战: AQS 源码 史上最详尽图解+逐行注释
- Java 使用 poi 导出Excel 源码完整示例
- JAVA语言之Java 中不同的并行实现的性能比较
- java并发:jdk1.8中ConcurrentHashMap源码浅析
- JAVA开发讲义(一)-Java的自白