功能简介

 
SequenceInputStream  合并流
顾名思义,就是可以吧两个流合并起来
 
他并没有很复杂,单纯的很,仅仅实现了InputStream
他拥有两个构造方法
把两个InputStream 
或者一个InputStream类型的Enumeration中包含的所有的流
连接起来
public SequenceInputStream(Enumeration<? extends InputStream> e)
public SequenceInputStream(InputStream s1, InputStream s2) 
 

实现原理

所谓的连接,只是顺序的读取多个流而已
接下来,我们详细看下
内部包含一个in 以及一个Enumeration
in用来表示当前的流
Enumeration保存了所有的流
如果构造方法入参为Enumeration
直接内部的Enumeration指向参数
如果传递的是两个InputStream
创建一个Vector,将这两个流添加到Vector中
然后调用Vector的elements 获得Enumeration
 
可以看得到,构造方法中都调用了nextStream这个方法
他是用来给in赋值的
如果是第一次调用,in肯定为null,所以不会进入第一行的if   会从Enumeration中读取一个流,赋值给in
如果是后来的调用,会把in指向的流进行close,然后在获取下一个流
显然,这个方法的场景就是构造方法执行之后的初始化
以及当一个流读取数组结束之后,尝试从下一个流读取
 
read()方法将会持续从in中读取数据
从一个流读取数据,如果不是-1 返回,如果是那么更新当前的in 指向下一个流
然后如果in不为null,进行读取 如果不是-1 返回,如果是那么更新当前的in 指向下一个流
.........
直到最后一个流, in就是一个游标
多参数的也是类似
从流中读取数据,如果读取到了,返回n,数据写入到字节数组b中了
如果n<=0 说明 当前的in读取结束了
那么调用nextStream 然后do  while循环读取
 
 
因为in始终指向当前的流,如果当前流为null,那么的确没有可用的
否则直接返回  in.available
 
close方法更直接
从头到尾通过nextStream遍历一遍所有的流
nextStream方法会把当前的流close掉
也就完成了所有的流的关闭
 

总结

SequenceInputStream的使用比较简单,只需要传递进入两个流或者一个包含流的Enumeration即可
他的read方法与InputStream方法的语义是相同的
再就没有任何难点了
换句话说,只要通过构造方法构造好了SequenceInputStream之后,就当做什么都没发生,他就是一个最基础的InputStream
 
需要了解到,它内部的实现细节,就是不断地循环遍历内部的流
 
 
 
 
 
 
 
 
 

[十五]javaIO之SequenceInputStream的更多相关文章

  1. [二十五]JavaIO之RandomAccessFile

    功能简介 我们之前一直说流顺序的,不能随机访问,的确之前说的IO体系的确如此 但是 RandomAccessFile自成一派 此类的实例支持对随机访问文件的读取和写入 我们之前介绍过DataOutpu ...

  2. 我的MYSQL学习心得(十五) 日志

    我的MYSQL学习心得(十五) 日志 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  3. Bootstrap <基础二十五>警告(Alerts)

    警告(Alerts)以及 Bootstrap 所提供的用于警告的 class.警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 您可以为警告框添加一个 ...

  4. Bootstrap<基础十五> 输入框组

    Bootstrap 支持的另一个特性,输入框组.输入框组扩展自 表单控件.使用输入框组,可以很容易地向基于文本的输入框添加作为前缀和后缀的文本或按钮. 通过向输入域添加前缀和后缀的内容,您可以向用户输 ...

  5. 解剖SQLSERVER 第十五篇 SQLSERVER存储过程的源文本存放在哪里?(译)

    解剖SQLSERVER 第十五篇  SQLSERVER存储过程的源文本存放在哪里?(译) http://improve.dk/where-does-sql-server-store-the-sourc ...

  6. Senparc.Weixin.MP SDK 微信公众平台开发教程(十五):消息加密

    前不久,微信的企业号使用了强制的消息加密方式,随后公众号也加入了可选的消息加密选项.目前企业号和公众号的加密方式是一致的(格式会有少许差别). 加密设置 进入公众号后台的“开发者中心”,我们可以看到U ...

  7. 十五个常用的jquery代码段【转】

    好的文章顶一个 回到顶部按钮 通过使用 jQuery 中的 animate 和 scrollTop 方法,你无需插件便可创建一个简单地回到顶部动画: 1 // Back to top 2 $('a.t ...

  8. 十五个常用的jquery代码段

    十五个常用的jquery代码段 回到顶部按钮 通过使用 jQuery 中的 animate 和 scrollTop 方法,你无需插件便可创建一个简单地回到顶部动画: 1 // Back to top ...

  9. 淘宝(阿里百川)手机客户端开发日记第十五篇 JSON解析(四)

    解析一个从淘宝传递的JSON (大家如有兴趣可以测试下):{ "tae_item_detail_get_response": { "data": { " ...

随机推荐

  1. C# 中传参中的OUT 和 ref 区别 笔记

    //out传参前需要对参数进行赋值处理,ref则不需要.//out.ref 传参都可以对值进行改变 1 static void Main(string[] args) { ; //int J = 10 ...

  2. FCC学习笔记(一)

    除了像素,你还可以使用百分比来指定border-radius边框半径的值. 给你的猫咪图片一个50%的border-radius. a元素,也叫anchor(锚点)元素,既可以用来链接到外部地址实现页 ...

  3. Bad Hair Day [POJ3250] [单调栈 或 二分+RMQ]

    题意Farmer John的奶牛在风中凌乱了它们的发型……每只奶牛都有一个身高hi(1 ≤ hi ≤ 1,000,000,000),现在在这里有一排全部面向右方的奶牛,一共有N只(1 ≤ N ≤ 80 ...

  4. Pycharm安装+python安装+环境配置

    Pycharm 工具: 1.安装jdk(64位):jdk-8u65-windows-x64.exe 路径:C:\Program Files\Java(默认路径) 2.配置环境 步骤一: 系统变量→新建 ...

  5. mysql 水平分表

    新建10张表,user_0,user_1,...user_9,方法不可串用,采用hash或取余法,获取要操作的表名,取值用对应存值的方法 1.hash取余法 public function part_ ...

  6. Mesos源码分析(5): Mesos Master的启动之四

      5. Create an instance of allocator.   代码如下   Mesos源码中默认的Allocator,即HierarchicalDRFAllocator的位置在$ME ...

  7. javascript 省市区三级联动 附: json数据

    html: <label> <span>购买地址</span> <select name="PurchaseProvince" style ...

  8. HTTP协议概念与特点,HTTP的状态码,HTTPS是什么?

    很多人在打开网页的时候,在浏览器地址栏里都会看到http  ,在Java WEB里,HTTP也是个重点内容,今天我们就来详细了解和学习HTTP . HTTP是Hyper Text Transfer P ...

  9. ansible基础-playbooks

    1. playbooks介绍 如果说ansible的modules是工具,inventory配置文件是原材料,那么playbook就是一封说明书,这里会记录任务是如何如何执行的,当然如果你愿意,这里也 ...

  10. [Swift]LeetCode331. 验证二叉树的前序序列化 | Verify Preorder Serialization of a Binary Tree

    One way to serialize a binary tree is to use pre-order traversal. When we encounter a non-null node, ...